2013-07-18 26 views
3

我試圖在Ember.js應用程序中構建一個非阻塞的異步調用而不使用Ember數據。Ajax沒有餘燼數據 - 未捕獲TypeError:對象#<Object>沒有方法'forEach'

我有以下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錯誤:

Uncaught TypeError:Object#has no method'forEach'

我已經建立了d我見過的幾個變體,但似乎沒有任何工作。任何幫助,將不勝感激......

編輯 - 發現與噶大山一些幫助解決,這裏的工作代碼:

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; 
    } 
}); 

回答

4

response.forEach建議你期待JSON響應體是一個數組。它可能包裹在像playersdata這樣的一些根元素中。

{ 
    "players": [...] 
} 

如果這是你需要的是根元素上使用forEachresponse.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

+0

是的,你認爲正確的JSON格式。你的解決方案完美運作非常感謝。 – Bevan

+0

其實我發現一個問題,你的解決方案似乎阻止加載頁面。我怎樣才能繼續加載其餘的ember.js頁面而不等待Web服務響應呢? – Bevan

+0

無論如何,我找到了一種方法。我將在上面的帖子中添加解決方案。 – Bevan

相關問題