与 Ember CLI Mirage 的关系
Relationships with Ember CLI Mirage
我是 Ember 的新手,我正在尝试创建一个简单的应用程序,其中我有 2 个模型,Mountains 和 Ranges。一个山脉有许多山脉,而一座山脉属于一个山脉。
我想在他们之间建立关系。
我在网上搜索过,但发现了不同的解释,但我仍在为这个问题而苦恼。
我的模型是:
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 中与 Mirage 建立关系的正确方法吗?
我还想在喜马拉雅页面(我已经创建了一条路线和一个模板)中显示属于喜马拉雅山脉的所有山脉。我怎样才能做到这一点?
提前致谢。
目前,您必须手动进行关系簿记,所以是的,您走对了路。请注意,您可能希望使用山脉 ID 更新范围:
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 });
server.db.ranges.update(himalaya.id, {mountain_ids: [everest.id]});
server.db.ranges.update(karakorum.id, {mountain_ids: [k2.id]});
但是 Sam Selikoff 正在为 Mirage 努力工作,很快就可以做这样的事情了:
var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871' });
var k2 = server.create('mountain', {id:2, name: 'K2', altitude: '8657' });
var himalaya = everest.create('range', {id: 1, name:'Himalaya', length:'16598' });
var karakorum = k2.create('range', {id: 2, name:'Karakorum', length:'34801' });
I'd also like to show in the himalaya page (I've already created a route and a template) all the mountains that belong to the range himalaya. How can I achieve this?
直接的解决方案是创建以下 Mirage 路由:
mountains/:id
ranges/:id
如果您的关系是同步的,在您的 Ember range
路线中,您必须请求一个范围,获取其相关的山脉 ID 并请求它们。
如果你的关系是异步的,那么你只需要请求范围。 Ember/ED 从模板访问时将自动请求缺少的相关记录。但是这样会导致页面一闪而过的丢失数据。
一个更优雅的解决方案是旁加载。您只需要一条 ranges/:id
Mirage 路线。当通过该路线请求范围时,除了请求的范围之外,您还有 Mirage 服务(侧载)相关的山脉。
还要考虑您正在使用的 JSON 结构。如果您使用的是旧式 adapter/serializer,API 有点随意,您没问题。如果您使用新的 JSONAPI 适配器,则需要遵守 JSONAPI 规范。为了侧载某些数据,您需要 explicitly ask for it.
JSONAPI 序列化在 Mirage 中尚不可用。最终你将能够使用速记,但目前你必须 manually format the data 到 JSONAPI 格式。
对于那些仍然遇到这个答案的人,Mirage 现在有完整的关联支持。
我是 Ember 的新手,我正在尝试创建一个简单的应用程序,其中我有 2 个模型,Mountains 和 Ranges。一个山脉有许多山脉,而一座山脉属于一个山脉。 我想在他们之间建立关系。 我在网上搜索过,但发现了不同的解释,但我仍在为这个问题而苦恼。
我的模型是:
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 中与 Mirage 建立关系的正确方法吗? 我还想在喜马拉雅页面(我已经创建了一条路线和一个模板)中显示属于喜马拉雅山脉的所有山脉。我怎样才能做到这一点?
提前致谢。
目前,您必须手动进行关系簿记,所以是的,您走对了路。请注意,您可能希望使用山脉 ID 更新范围:
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 });
server.db.ranges.update(himalaya.id, {mountain_ids: [everest.id]});
server.db.ranges.update(karakorum.id, {mountain_ids: [k2.id]});
但是 Sam Selikoff 正在为 Mirage 努力工作,很快就可以做这样的事情了:
var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871' });
var k2 = server.create('mountain', {id:2, name: 'K2', altitude: '8657' });
var himalaya = everest.create('range', {id: 1, name:'Himalaya', length:'16598' });
var karakorum = k2.create('range', {id: 2, name:'Karakorum', length:'34801' });
I'd also like to show in the himalaya page (I've already created a route and a template) all the mountains that belong to the range himalaya. How can I achieve this?
直接的解决方案是创建以下 Mirage 路由:
mountains/:id
ranges/:id
如果您的关系是同步的,在您的 Ember range
路线中,您必须请求一个范围,获取其相关的山脉 ID 并请求它们。
如果你的关系是异步的,那么你只需要请求范围。 Ember/ED 从模板访问时将自动请求缺少的相关记录。但是这样会导致页面一闪而过的丢失数据。
一个更优雅的解决方案是旁加载。您只需要一条 ranges/:id
Mirage 路线。当通过该路线请求范围时,除了请求的范围之外,您还有 Mirage 服务(侧载)相关的山脉。
还要考虑您正在使用的 JSON 结构。如果您使用的是旧式 adapter/serializer,API 有点随意,您没问题。如果您使用新的 JSONAPI 适配器,则需要遵守 JSONAPI 规范。为了侧载某些数据,您需要 explicitly ask for it.
JSONAPI 序列化在 Mirage 中尚不可用。最终你将能够使用速记,但目前你必须 manually format the data 到 JSONAPI 格式。
对于那些仍然遇到这个答案的人,Mirage 现在有完整的关联支持。