没有ember数据的Ajax - 未捕获的TypeError:Object#<object>没有方法'forEach'</object>

时间:2013-07-18 01:47:02

标签: ember.js

我正在尝试在不使用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;
    }
});

1 个答案:

答案 0 :(得分:4)

您的response.forEach表示您希望json响应正文是一个数组。它可能包含在某些根元素中,如playersdata,如此。

{
  "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