7

我是 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 建立关系的正确方法吗?我还想在喜马拉雅页面(我已经创建了一条路线和一个模板)中显示属于喜马拉雅山脉的所有山脉。我怎样才能做到这一点?

提前致谢。

4

2 回答 2

7

目前,您必须手动进行关系簿记,所以是的,您走的是正确的道路。请注意,您可能希望使用山 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' });

我还想在喜马拉雅页面(我已经创建了一条路线和一个模板)中显示属于喜马拉雅山脉的所有山脉。我怎样才能做到这一点?

直接的解决方案是创建以下 Mirage 路由:

  • mountains/:id
  • ranges/:id

如果您的关系是同步的,则在您的 Emberrange路线中,您必须请求一个范围,获取其相关的山 id 并也请求它们。

如果您的关系是异步的,那么您只需要请求范围。当从模板访问缺失的相关记录时,Ember/ED 将自动请求这些记录。但这会导致页面上出现一闪而过的缺失数据。

更优雅的解决方案是侧载。您只需要ranges/:idMirage 路线。当通过该路线请求范围时,除了请求的范围之外,您还有 Mirage 服务(侧载)相关的山脉。

还要考虑您正在使用的 JSON 结构。如果您使用的是老式适配器/序列化器,那么 API 有点随意,您很好。如果您使用的是新的 JSONAPI 适配器,那么您需要遵守 JSONAPI 规范。为了侧载某些数据,您需要明确要求它

开箱即用的 Mirage 中尚不提供 JSONAPI 序列化。最终您将能够使用速记,但目前您必须手动将数据格式化为 JSONAPI 格式。

于 2015-09-14T11:22:32.300 回答
3

对于那些仍然遇到这个答案的人,Mirage 现在拥有完整的关联支持。

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

于 2017-05-31T11:26:16.160 回答