【问题标题】:How to sideload ember hasMany and belongsTo Relationship?如何侧载 ember hasMany 和 belongsTo 关系?
【发布时间】:2013-03-05 07:39:47
【问题描述】:

我有一个人模型如下

 App.Person= DS.Model.extend({
      id: DS.attr('string'),   
      name: DS.attr('string'),
      visits: DS.hasMany('App.Visit'),
      events: DS.hasMany('App.Event') ,
      allergies: DS.hasMany('App.Allergies'),
      get_allergies : function(){
    return this.get('allergies').getEach('allergy_name').reduce(function(accum, item) {
      return (accum.length > 0) ? (accum +', '+ item) : (item);
    }, '');
  }.property('allergies.@each.allergy_name')    
    });


App.Visit = DS.Model.extend({
  visit_id: DS.attr('string'),
  date: DS.attr('date'),     
  admission: DS.belongsTo('App.Admission')
});

App.Admission = DS.Model.extend({
  loc: DS.attr('string'),
  admission_date: DS.attr('date'),
  care_team: DS.belongsTo('App.CareTeam')
});

如您所见,Person hasMany "allergies",以及 person,allergies 也为我加载,因为在 UI 中我调用 get_allergies 方法,而其他 hasMany 关系(如“visits”和“events”)没有得到已加载。

在用户界面中 {{person.get_allergies}}

我试图侧载关系“访问”和“事件”(使用网络上的示例),但这不起作用?有人能告诉我什么是侧载 ember-data 的正确方法,因为除了 stackoverflow 本身的几个问题外,我在网上找不到任何合适的示例文档吗?

【问题讨论】:

  • 你能展示上面的 App.Admission 模型吗?如果您手动点击 REST 端点,那么入场和访问模型的 json 是什么样的?
  • @ToranBillups 更新了问题
  • 嗨,托兰,我已经更新了这个问题......我只想要一个在 ember-data 中侧载关系的正确示例

标签: ember.js ember-data


【解决方案1】:

根据the documentation,您应该在来自服务器的响应中添加额外的访问和事件数据。

{
  "person": {
    "id": 1,
    ...
    "event_ids": [5, 6, 7]
  },

  "events": [{
    "id": 5,
    ...
  },
  {
    "id": 6,
    ...
  },
  {
    "id": 7,
    ...
  }]
}

这里的重点是事件数据应该在人员数据之外。

您使用标准的 REST 适配器吗?能否请您添加一个服务器返回的示例 json?

【讨论】:

    【解决方案2】:

    为了在我的应用中旁加载数据,我配置了 ember-data 以了解我将要旁加载的内容类型。例如。要旁载事件和访问,请执行以下操作:

    DS.RESTAdapter.configure('App.Event', {
        sideloadsAs: 'events'
    });
    
    DS.RESTAdapter.configure('App.Visit', {
        sideloadsAs: 'visits'
    });
    
    App.Store = DS.Store.extend({
        revision: 11
    });
    

    然后在你的 json 中可以如下所示:

    {
      "person": {
        "id": 1,
        "event_ids": [5, 6, 7],
        "visit_ids": [1, 2, 3]
      },
    
      "events": [
        { "id": 5 },
        { "id": 6 },
        { "id": 7 }
      ],
    
      "visits": [
        { "id": 1 },
        { "id": 2 },
        { "id": 3 }
      ]
    }
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但设置有点不同。 visits 不知道他们的person(即不能做visit.get('person.name'))。我必须为visit 添加一个序列化程序:

      export default AppSerializer.extend({
        attrs: {
          person: 'personId'
        },
      });
      

      我的有效载荷如下所示:

      {
        person: {
          id: 1,
          name: 'John',
          visitIds: [1, 2, 3]
        },
      
        visits: [
          { id: 1,
            personId: 1
          },
          { id: 2,
            personId: 1
          },
          { id: 3,
            personId: 1
          }
        ]
      }
      

      person模特:

      export default DS.Model.extend({
        name: DS.attr('string'),
        visits: DS.hasMany('visit')
      });
      

      visit模特:

      export default DS.Model.extend({
        person: DS.belongsTo('person')
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多