如何让Ember变为懒惰(异步)加载hasMany

时间:2016-06-20 21:01:56

标签: ember.js ember-data

我可能误解了Ember如何懒惰地加载hasMany关系,但我会指定我想要的东西,有人可以告诉我它是否可能以及如何配置。< / p>

我使用RESTAdapter并且我有一个与多个其他对象具有1对多关系的父对象。当我查看父级时,我有子对象的链接,我想将其显示为子出口。

示例可能是:

// brand.js
export default Model.extend({
  name: attr('string'),
  description: attr('string'),
  dateCreated: attr('date'),
  lastUpdated: attr('date'),
  regions: hasMany('region', {async: true})
});

// region.js
export default Model.extend({
  name: attr('string'),
  dateCreated: attr('date'),
  lastUpdated: attr('date'),
  brand: belongsTo()
});

当我访问/api/brands/1时,我将返回以下JSON:

{
  "brand": {
    "id": 1,
    "dateCreated": 1466456255539,
    "lastUpdated": 1466456255936,
    "name": "Some Brand",
    "description": "Voluptates odio nemo corrupti",
  }
}

我的路线定义如下:

this.route('brand', {path: '/brands/:brand_id'}, function() {
  this.route('regions');
});

因此,在brand详细信息屏幕中,我有{{outlet}},当我点击regions的链接时,我需要获取该品牌的区域和网址将是/api/brands/1/regions

如果我在一个大结果中返回所有数据,那么一切正常,我的regions路由器看起来像这样:

export default Ember.Route.extend({
  model() {
    return this.modelFor('brand').get('regions');
  }
});

但是我不知道该怎么做才能从我的API中正确地获取区域。或者,如果它是可能的。我在side loading上阅读,目前,我的API不会仅为儿童返回ID。

1 个答案:

答案 0 :(得分:1)

以您的示例为例,ember.js不知道要加载哪些区域。您的JSON必须是(非嵌入式):

{
  "brand": {
    "id": 1,
    "dateCreated": 1466456255539,
    "lastUpdated": 1466456255936,
    "name": "Some Brand",
    "description": "Voluptates odio nemo corrupti",
    "regions": ["5", "9"]
  }
}

然后加载id为5和9的区域。或者你可以直接嵌入它们:

{
  "brand": {
    "id": 1,
    "dateCreated": 1466456255539,
    "lastUpdated": 1466456255936,
    "name": "Some Brand",
    "description": "Voluptates odio nemo corrupti",
    "regions": [{
      "id": "5",
      "name": "Hanover",
      "dateCreated": "2016-09-25 18:39:18",
      "lastUpdated": "2016-09-25 18:39:18",
    },{
      "id": "9",
      "name": "Cologne",
      "dateCreated": "2016-01-19 11:59:18",
      "lastUpdated": "2016-02-22 12:09:58",
    }]
  }
}

后者见here