Discourse 的一位创始人在他的博客http://eviltrout.com/2013/02/27/adding-to-discourse-part-1.html上发布了一篇文章,解释了他如何在 Ember 中进行 ajax 查询(而不是使用 Ember 数据)。如果用户导航到一条路线,它将触发一个 found 方法
路线
Discourse.AdminReportsRoute = Discourse.Route.extend({
model: function(params) {
return(Discourse.Report.find(params.type));
},
查找方法
Discourse.Report.reopenClass({
find: function(type) {
var model = Discourse.Report.create();
jQuery.ajax("/admin/reports/" + type, {
type: 'GET',
success: function(json) {
model.mergeAttributes(json.report);
model.set('loaded', true);
},
});
return(model);
}
});
我使用不同的示例使其工作,但是,在成功回调中,我收到此错误消息
Uncaught TypeError: Object [object Object] has no method 'mergeAttributes'
因为我没有设置 Discourse,所以我创建了一个不同的域模型
App.Restaurant = Ember.Object.extend({});
App.Restaurant.reopenClass({
find: function(type) {
var model = App.Restaurant.create();
jQuery.ajax("restaurants/",{
type: 'GET',
success: function(json) {
console.log(json);
model.mergeAttributes(json.restaurants);
model.set('loaded', true);
},
});
return(model);
}
});
在成功回调中记录 json 显示了这一点
Object {restaurants: Array[28]}
restaurants: Array[28]
__proto__: Object
为什么我的模型上没有定义 mergeAttributes?
我试图删除 model.mergeAttributes 并做
success: function(json) {
model.set('loaded', true);
},
我收到这个错误
Assertion failed: The value that #each loops over must be an Array. You passed <App.Restaurant:ember322>
所以如果我不能做mergeAttributes,有没有办法让成功回调中返回的数据成为一个数组?
{{#if loaded}}
<ul>
{{#each item in model}}
<li>{{item}}</li>
{{/each}}
</ul>
{{else}}
{{ loading}}
{{/if}}
--
model: function(params) {
return(App.Restaurant.findAll(params));
},
renderTemplate: function() {
this.render('restaurants', {into: 'application'});
}