如何在Ember中加载hasMany?

时间:2014-04-01 01:36:03

标签: ember.js ember-data

我有两种模式:

App.Offer = DS.Model.extend({
    name: DS.attr('string'),
    description: DS.attr('string'),

    products: DS.hasMany('product')
});

App.Product = DS.Model.extend({
    name: DS.attr('string'),
    description: DS.attr('string'),

    offer: DS.belongsTo('offer')
});

服务器以这种方式回复记录和数组(例如,如果其余适配器要求/ offers / 1):

 { "offer": [ { "id": 1, "name": "aaaaaaaaa", "description": "aaaa", "product_ids": [ 1, 2 ] } ] }

但现在我该如何获得产品?我有这样的路线:

App.OffersRoute = Ember.Route.extend({
    model: function() {
        var offer = this.get('store').find('offer', 1);
        return offer
    }
});

在Ember指南中写道,如果你想要你应该做的产品:

offer.get('products');

好的,但我应该把它放在哪里?在模型钩?在Controller属性中? 我尝试了很多东西,但我看不到产品的网络请求?id [] = 1& id [] = 2正如我预期的那样(服务器正确响应此请求);

有人可以举例说明如何在我的模板中找到优惠,产品并使用这些数据吗?

1 个答案:

答案 0 :(得分:1)

如果你正在使用RESTAdapter,你的数据需要采用这种格式(如果你不想以这种格式返回它,你可以创建一个自定义序列化程序并修复json)。

2个不同之处:

  1. offer下的项目不应该是数组,因为您正在寻找一个应该是对象的项目
  2. 密钥product_ids应为productsproduct_ids是ActiveModelAdapter / ActiveModelSerializer使用的格式。
  3. JSON

    {
       "offer":
          {
             "id":1,
             "name":"aaaaaaaaa",
             "description":"aaaa",
             "products":[
                1,
                2
             ]
          }
     }
    

    如果您希望在单独的有效负载中返回hasMany关系,则应将其标记为异步。

    App.Offer = DS.Model.extend({
        name: DS.attr('string'),
        description: DS.attr('string'),    
        products: DS.hasMany('product', {async:true})
    });
    

    我在下面的jsbin中将它连接起来,但是如果你检查网络标签,我没有勾选products?ids[]=1&ids[]=2(注意ids[]=,而不是id[]=)的结果我会看到发出的请求(但由于没有结果,它会崩溃)。

    http://emberjs.jsbin.com/OxIDiVU/345/edit