我正在尝试在不使用 Ember Data 的情况下在 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;
}
});
我在我的 route 这样调用它:
App.IndexRoute = Ember.Route.extend({
model: function (params) {
return App.Player.getPlayers();
}
});
出于某种原因,我收到以下 javascript 错误:
未捕获的类型错误:对象 # 没有方法 '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;
}
});
最佳答案
您的 response.forEach
表明您希望 json 响应主体是一个数组。它可能被包裹在一些根元素中,例如 players
或 data
,就像这样。
{
"players": [...]
}
如果是这种情况,您需要在该根元素上使用 forEach
,例如 response.players.forEach
。
您还想重组该代码以直接返回 promise 。然后 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
解决 promise 。 Ember 明白当 promise 解决时,结果就是 model
。
关于ember.js - 没有 Ember 数据的 Ajax - 未捕获的类型错误 : Object #<Object> has no method 'forEach' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17713140/