我是Ember的新手,我正在尝试创建一个简单的应用程序,我有2个模型,山脉和山脉 . 范围有许多山脉,而山脉属于一个范围 . 我想在他们之间 Build 一种关系 . 我在网上搜索过,但我发现了不同的解释,我仍然在努力解决这个问题 .
我的模特是:
mountain.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
altitude: DS.attr('number'),
range: DS.belongsTo('range', {async: true})
});
range.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
length: DS.attr('number'),
mountains: DS.hasMany('mountain', {async: true})
});
我的 mirage/scenario/default.js
文件如下所示:
export default function(server)
{
var himalaya = server.create('range', {id: 1, name:'Himalaya', length:'16598' });
var karakorum = server.create('range', {id: 2, name:'Karakorum', length:'34801' });
var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871', range_id:1 });
var K2 = server.create('mountain', {id:2, name: 'K2', altitude: '8657', range_id:2 });
}
这些是 mirage/factories/range.js
和 mirage/factories/mountain.js
文件:
import Mirage, {faker} from 'ember-cli-mirage';
export default Mirage.Factory.extend({
});
这是在Ember-CLI中与海市蜃楼 Build 关系的正确方法吗?我还想在喜马拉雅页面(我已经创建了一条路线和一个模板)中显示属于喜马拉雅山脉的所有山脉 . 我怎样才能做到这一点?
提前致谢 .
2 回答
目前,你必须手动进行关系簿记,所以是的,你是正确的方式 . 请注意,您可能希望使用mountain id更新范围:
但Sam Selikoff正在努力开发Mirage,很快就可以做到这样的事情:
直接的解决方案是创建以下Mirage路线:
mountains/:id
ranges/:id
如果你的关系是同步的,那么在你的Ember
range
路线中你必须要求一个射程,得到它相关的山ids并要求它们 .如果您的关系是异步的,那么您只需要请求范围 . 当从模板访问时,Ember / ED将自动请求丢失相关记录 . 但这会导致页面上缺少数据 .
更优雅的解决方案是侧载 . 你只需要
ranges/:id
幻影路线 . 当通过该路线请求范围时,除了请求的范围之外,您还有Mirage服务(侧载)相关的山脉 .另外考虑到你使用oldschool适配器/序列化器的JSON结构,API有点武断,你需要使用新的JSONAPI适配器,那么你需要遵守JSONAPI规范 . 为了使某些数据侧载,您需要explicitly ask for it .
开箱即用的Mirage尚未提供JSONAPI序列化 . 最终你必须'll be able to use shorthands, but currently you'到JSONAPI格式 .
对于仍然遇到这个答案的人来说,Mirage现在有完整的关联支持 .
http://www.ember-cli-mirage.com/docs/v0.3.x/models/