2016-09-15 83 views
0

我使用的是烬2.8.0和烬数据2.8.0。我有以下型号定义:余烬数据未加载belongsTo模型

//app/models/store.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    floor: DS.belongsTo('floor'), 
    number: DS.attr('string'), 
    phone: DS.attr('string'), 
    email: DS.attr('string'), 
    photo: DS.attr(), 
    createdAt: DS.attr('date'), 
    updatedAt: DS.attr('date') 
}); 

//app/models/floor.js 
import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    stores: DS.hasMany('store'), 
    createdAt: DS.attr('date'), 
    updatedAt: DS.attr('date') 
}); 

router.js有以下途径:

//app/router.js 
this.route('stores', function() { 
    this.route('new'); 
    this.route('edit'); 
}); 

模板/专卖店/ index.hbs有以下{{#each}}声明:

<tbody> 
     {{#each model as |store|}} 
     <tr> 
      <td>{{store.name}}</td> 
      <td>{{store.number}}</td> 
      <td>{{store.floor.name}}</td> 
      <td>{{store.phone}}</td> 
      <td>{{store.email}}</td> 
      <td>{{moment-format store.createdAt}}</td> 
      <td>{{moment-format store.updatedAt}}</td> 
     </tr> 
     {{/each}} 
</tbody> 

我本来预计行{{store.floor.name}}会h ave向表中的每一行提出了/ floors/{id}的请求。

我缺少什么? 在Ember中处理这个问题的正确方法是什么?

我的api应该返回与下面不同的东西吗?

[{"id":1,"floorId":1,"name":"McDonalds","number":"10-A","phone":"(11) 2020-3455","email":"[email protected]","photo":null,"createdAt":"2016-09-15T13:45:32.000Z","updatedAt":"2016-09-15T13:45:32.000Z"}] 

我应该使用其他型号的钩手动加载相关的模型?

+1

您的'store'模型的属性名称需要与服务器为您提供的内容相匹配,除非您已在适配器/序列化程序/某处为我们定义了一些特殊处理(我忘记了现在发生了这种情况)似乎不可能。所以,返回'floor'而不是'floorId',事情可能刚刚开始工作。 – Thernys

+0

@Thernys现场,谢谢!有趣的是,改变我的api返回值会修复它,但是,将模型的属性名称从'floor'更改为'floorId'不会。这将是一些呃数据公约thingy?还有,请谨慎回答这个问题? –

+0

还发现你可以自定义处理,如你所说@Thernys:https://guides.emberjs.com/v2.8.0/models/customizing-serializers/#toc_relationships –

回答

0

正如开始(并且很小心地)在评论中回答的,store型号的属性名称预计将与服务器提供的内容相匹配,除非您有defined custom processing for them in your serializer。所以,返回floor而不是floorId,事情可能刚刚开始工作。

我不完全确定为什么它不适合您更改属性名称以匹配服务器结果(floor: DS... => floorId: DS...)。据我所知,它应该以这种方式工作(就像我刚刚尝试时那样)。我喜欢采取PEBKAC的方法,所以在有限的信息可用的情况下,我将假设您的测试条件可能有缺陷。也许你已经修改了服务器以返回floor,这不再与模型的期望相符。也许你忘了更改模板中的{{store.floor.name}}以匹配新的定义。如果使用Ember-CLI,也许你忘了重建你的项目。

或者也许我只是不知道我在说什么,如果您足够关心并试图排除用户错误,您应该提出一个新问题。

0

ember-data期望来自后端的数据的方式取决于您的序列化程序。你没有指定你使用的序列化器,所以我不能告诉你它期望的。但是内部数据预计的格式是jsonapi。因此,对于你的情况,这是正确的:

{ 
    "data": [ 
    { 
     "id": "1", 
     "type": "store", 
     "attributes": { 
     "name": "McDonalds", 
     "number": "10-A", 
     "phone": "(11) 2020-3455", 
     "email": "[email protected]", 
     "photo": null, 
     "createdAt": "2016-09-15T13:45:32.000Z", 
     "updatedAt": "2016-09-15T13:45:32.000Z" 
     }, 
     "relationships": { 
     "floor": { 
      "data": { 
      "type": "floor", 
      "id":"1" 
      } 
     } 
     } 
    } 
    ] 
} 

确保你的序列化程序为你的后端响应返回这种格式。

+1

谢谢。答案已经在问题的评论中给出了...... –