首页 文章

与Ember CLI Mirage的关系

提问于
浏览
6

我是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.jsmirage/factories/mountain.js 文件:

import Mirage, {faker} from 'ember-cli-mirage';

export default Mirage.Factory.extend({

});

这是在Ember-CLI中与海市蜃楼 Build 关系的正确方法吗?我还想在喜马拉雅页面(我已经创建了一条路线和一个模板)中显示属于喜马拉雅山脉的所有山脉 . 我怎样才能做到这一点?

提前致谢 .

2 回答

  • 2

    目前,你必须手动进行关系簿记,所以是的,你是正确的方式 . 请注意,您可能希望使用mountain 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

    如果你的关系是同步的,那么在你的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格式 .

  • 7

    对于仍然遇到这个答案的人来说,Mirage现在有完整的关联支持 .

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

相关问题