我正在使用Ember Data检索带有歌曲的播放列表。代码是:
App.PlaylistRoute = Em.Route.extend({
model: function(params) {
var plist = this.store.find('playlist', params.id);
console.log(plist);
return [];
}
})
App.Playlist = DS.Model.extend({
beats: DS.hasMany('beat')
});
App.Beat = DS.Model.extend({
name: DS.attr('string')
});
此代码的问题在于它可以工作并返回数据,但是在一个不起眼的对象中,而不是在模型中。我不能再plist.get('beats')
或plist.get('id')
,因为它只返回undefined
。 JSON数据非常简单:
{
"playlist": {
"id": "popular-beats",
"beats": [
"1",
"2"
]
},
"beats": [
{
"id": "1",
"name": "Name"
},
{
"id": "2",
"name": "Another Name"
}
]
}
当我在控制台中记录数组时,这是返回的对象:
__ember1383247403867: "ember293"
__ember1383247403867_meta: e
_super: undefined
content: s
isFulfilled: true
toString: function (){return e}
__proto__: Object
如果我深入研究content._data
我将找到beats
数组 - 因此数据已成功加载,但它没有返回我期望的正确模型。
答案 0 :(得分:2)
store.find()不会立即返回模型对象,它会返回promise,将来会包含'beats'和'id'属性。因此,您可以在模板中使用模型,并在模型更新时更新模板。
http://emberjs.jsbin.com/oTEvIwe/3 - 这是一个基于路由器和模型的ember应用程序。 在控制台中,你可以看到plist.get('beats')在router#model中是未定义的,但是html页面包含它。
如果你想在路由器中使用模型进行操作,可以使用setupController。
http://emberjs.jsbin.com/oTEvIwe/3/edit - 来源。
有关承诺的更多信息 - http://emberjs.com/guides/routing/asynchronous-routing/