我正在尝试在不使用Ember数据的情况下在Ember.js应用中构建非阻塞异步调用。
我有以下Ember.js模型:
App.Player = Ember.Object.extend({
id: '',
alias: '',
name: '',
twitterUserName: '',
isFeatured: ''
});
App.Player.reopenClass({
getPlayers: function () {
var players = Ember.ArrayProxy.create({ content: [] });
$.getJSON("/api/players").then(function (response) {
response.forEach(function (p) {
players.pushObject(App.Player.create(p));
});
});
return players;
}
});
我在以下路线中将其称为:
App.IndexRoute = Ember.Route.extend({
model: function (params) {
return App.Player.getPlayers();
}
});
出于某种原因,我收到以下javascript错误:
未捕获的TypeError:对象#没有方法'forEach'
我尝试了一些我见过的变种,但似乎没有任何效果。任何帮助将不胜感激......
编辑 - 在Darshan的帮助下找到解决方案,这是工作代码:
App.Player.reopenClass({
getPlayers: function () {
var players = [];
$.ajax({
url: "/api/players",
}).then(function (response) {
response.players.forEach(function (player) {
var model = App.Player.create(player);
players.addObject(model);
});
});
return players;
}
});
答案 0 :(得分:4)
您的response.forEach
表示您希望json响应正文是一个数组。它可能包含在某些根元素中,如players
或data
,如此。
{
"players": [...]
}
如果是这种情况,您需要在forEach
之类的根元素上使用response.players.forEach
。
您还希望重新构建该代码以直接返回承诺。然后,Ember路由器将暂停,直到您的json已加载,并且只有在完成后才会继续。像这样的东西,
getPlayers: function () {
return $.getJSON("/api/players").then(function (response) {
var players = Ember.ArrayProxy.create({ content: [] });
response.players.forEach(function (p) {
players.pushObject(App.Player.create(p));
});
return players;
});
}
返回players
解决承诺。而Ember知道,当一个承诺解决后,结果是model
。