2011-10-16 44 views
3

我正在看Backbone.js,但我被卡住了。直到現在的代碼儘可能簡單,但我似乎沒有得到它。我使用Firebug,而MomentsView渲染中的this.moments是一個對象,但集合中的所有方法都不起作用(即this.moments.get(1)不起作用)。Backbone.js:從PHP中的服務器檢索集合

的代碼:

var Moment = Backbone.Model.extend({ 
}); 

var Moments = Backbone.Collection.extend({ 
    model: Moment, 
    url: 'moments', 
    initialize: function() { 
     this.fetch(); 
    } 
}); 

var MomentsView = Backbone.View.extend({ 
    el: $('body'), 
    initialize: function() { 
     _.bindAll(this, 'render'); 

     this.moments = new Moments(); 
    }, 
    render: function() { 
     _.each(this.moments, function(moment) { 
      console.log(moment.get('id')); 
     }); 

     return this; 
    } 
}) 

var momentsview = new MomentsView(); 
momentsview.render(); 

從TE服務器(虛擬)響應:

[{"id":"1","title":"this is the moment","description":"another descr","day":"12"},{"id":"2","title":"this is the mament","description":"onother dascr","day":"14"}] 

該對象具有根據在螢火蟲的DOM兩種模式,但是這些方法不工作。 anybode是否有一個想法如何讓該集合在視圖中工作?

回答

1

這裏的問題是您在初始化MomentsView視圖時異步讀取數據,但您立即同步調用momentsview.render()。你所期望的數據還沒有從服務器回來,所以你會遇到問題。我相信如果您在回調中調用渲染,則在fetch()完成後執行一次。

此外,我不認爲你可以撥打_.each(this.moments) - 迭代收集,使用this.moments.each()

0

嘗試在實例化集合時刪除'()'。

this.moments = new Moments; 

此外,因爲它是異步調用,所以將集合的「更改」事件與呈現綁定。

我希望它能幫助你。

+0

我不認爲這會有什麼區別 - 它只是兩種語法變體。 – nrabinowitz

+0

我同意......但我有問題,因爲那個。 – Aito