可以说我有两个模型,Book
和Chapter
。
App.Book = DS.Model.extend({
name: DS.attr(),
chapters: DS.hasMany('chapter', { async: true })
});
App.Chapter = DS.Model.extend({
name: DS.attr(),
book: DS.belongsTo('book')
});
我正在使用RESTAdapter
。
App.ApplicationAdapter = DS.RESTAdapter;
在IndexRoute
比方说,我想获取的第一本书(ID = 1)和它的相关章节。由于该hasMany
关系被标记为async: true
,因此我想在呈现模板之前获取此关联。
App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.RSVP.hash({
book: this.store.find('book', 1)
}).then(function(hash) {
hash.chapters = hash.book.get('chapters');
return hash;
})
},
setupController: function(controller, model) {
controller.set('model', model.book);
}
});
我的索引模板仅显示书名,并遍历其章节。
<script type="text/x-handlebars" id="index">
<h3>Book: {{name}}</h3>
<ul>
{{#each chapters}}
<li>{{name}}</li>
{{/each}}
</ul>
</script>
使用mockjax时,我设置了模拟响应。
$.mockjax({
url: '/books/1',
responseText: {
book: {
id: 1,
name: 'Book 1',
chapters: [1, 2]
}
}
});
$.mockjax({
url: '/chapters?ids[]=1&ids[]=2',
responseText: {
chapters: [{
id: 1,
name: 'Chapter 1',
book_id: 1
}, {
id: 2,
name: 'Chapter 2',
book_id: 1
}]
}
});
问题1:根据RESTAdapter文档,访问book.get('chapters')
应向发出GET请求/chapters?ids[]=1&ids[]=2
。但是,我的控制台显示了对/chapters/1
和的两个独立请求/chapters/2
。
问题2:此外,我认为模板是在章节请求发生之前呈现的,因为模板是在我看到对/chapters/1
和的两个请求之前渲染了一两秒的/chapters/2
。如果我hash.book.get('chapters')
从路由中删除对的呼叫,则会发生相同的问题。换句话说,我不认为路由正在发送请求,我认为模板是。
这是一个jsbin。您会注意到它没有显示任何章节,因为我还没有设置它请求的两条路线(/chapters/1
和/chapters/2
)。
第一个问题的原因很简单:您使用的是Ember Data的Dev(Canary)版本,其行为与您可以在EmberJS网站上找到的beta版本不同。它是最前沿的,因此很难确定它是否已损坏或即将发生的变化。如果您希望行为与指南保持一致,我建议您使用最新的Beta版本(Ember Data尚未标记为稳定)。
至于第二个:这是您期望的行为,因为您将异步请求与Promises一起使用。这意味着,您将立即返回结果(无需等待任何内容),但是在解决异步请求之前,这些结果为空。
您可以包装这种行为,并(例如)仅在异步例程完成后才插入模板,但是我建议您重新考虑一下,因为根据个人经验,这不是常见的模式,并且您的应用很可能不需要它。
如果您对这些机制的确切工作方式感兴趣(您不需要它,仅是为了满足对此主题的潜在好奇心):
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句