2013-04-02 122 views
0

我正在與backbone.js玩弄,並陷入僵局。這裏是我的代碼:隱藏Backbone.js模型

window.Car = Backbone.Model.extend(); 
window.CarCollection = Backbone.Collection.extend({ 
    model: Car, 
    url:"../api/car/", 

}); 

window.CarListView = Backbone.View.extend({ 
    tagName:'ul', 

    initialize: function() { 
     this.model.on("reset", this.render); 
    }, 

    render: function (eventName) { 
     console.log(this.model);  //is an object 
     console.log(this.model.models); //is an empty array 

     return this; 
    }, 
}); 

// Router 
var AppRouter = Backbone.Router.extend({ 

    routes:{ 
     "":"list", 
     "cars/:id":"carDetails" 
    }, 

    list:function() { 
     this.carList = new CarCollection(); 
     this.carListView = new CarListView({model:this.carList}); 
     this.carList.fetch(); 
     $('#sidebar').html(this.carListView.render().el); 
    }, 

}); 

$(function() { 
    app = new AppRouter(); 
    Backbone.history.start(); 
}); 

我沒有足夠的信譽發表圖片,所以這裏是從Chrome開發人員工具控制檯的文本版本:

V r {length: 0, models: Array[0], _byId: Object, _events: Object, constructor: function…} 
    > _byId: Object 
    > _events: Object 
    > length: 4 
    > models: Array[4] 
    > __proto__: s 

我的問題是,我試圖訪問似乎「隱藏」在空白背後的非空模型屬性。如何訪問長度爲4的模型屬性?

回答

1

這是一個控制檯怪癖,但這裏的核心問題很常見 - 您打電話給.fetch()(異步加載),然後立即調用.render(),期望加載數據。您需要等到纔可以訪問它的數據加載 - 有幾種方法可以做到這一點,但最簡單的可能是通過一個success回調fetch

var carListView = this.carListView; 
this.carList.fetch({ 
    success: function() { 
      $('#sidebar').html(carListView.render().el); 
    } 
}); 

控制檯日誌這個奇怪的,因爲噹噹收集尚未加載(顯示Array[0])時,請致電console.log,但在加載完成後手動檢查它(顯示Array[4])。

+0

感謝,有兩件事:1:該代碼導致'未捕獲的ReferenceError:carListView未定義'。 2:我認爲綁定'重置'事件會導致渲染函數在數據被提取後被調用? –

+1

1.哎呀,你是對的 - 看看編輯。您需要將視圖別名爲變量,因爲'this'引用在回調中不起作用。 2.'reset'監聽器應該可以工作,但是在你調用'.fetch()'之後,你首先明確地調用'carListView.render()'。 – nrabinowitz