与 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.jsmirage/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 现在有完整的关联支持。

http://www.ember-cli-mirage.com/docs/v0.3.x/models/