2011-12-13 87 views
2

我已經初始化骨幹集合,但在集合上調用調用不起作用。出於某種原因,我得到JS錯誤:在主幹集合上調用調用

var vw = new SomeView(); // A view with function 'refresh' 
var col = new Backbone.Collection(); 
col.add(vw); 
... 
setTimeout(function(){ col.invoke('refresh'); }, 1000); // Error: Cannot call method 'apply' of undefined 

然而,像的isEmpty調用方法工作正常

console.log("Is empty? ", col.isEmpty()); // prints: 'Is Empty? false' 

我似乎失去了一些東西很明顯。

N.B:我不感興趣,呼籲每個功能,然後調用視圖對象刷新,因爲這只是笨拙。

回答

3

骨幹中的集合是一個模型列表。所以當你在內部添加一個視圖到集合時,它會調用這樣的col.add(Backbone.Model.extend(vw))。所以它會創建一個新的模型,將您的視圖作爲構造函數參數。如果您想將列表中的視圖存儲在列表中,請使用JavaScript數組或者更明智的下劃線集合

+0

除了骨幹網收集的其他好處(比如在對集合進行更改時引發的事件),調用_invoke_等方法使代碼更具可讀性。我明顯的替代方法是使用**每個**方法。無論如何感謝您的幫助。 – Waseem

+0

如果您需要調用,請使用下劃線colleection.invoke方法http://documentcloud.github.com/underscore/#invoke –

+0

明白了。你是對的,當添加到集合中時,視圖變成了一些模型,因此** invoke **不會找到函數**刷新**,除非您**從內部模型實例中獲取**並手動調用它。我已經切換到簡單數組作爲我的數據存儲,並使用下劃線的** invoke **方法調用。謝謝您的幫助。 – Waseem

0

您嘗試通過實例化集合本身來創建集合, 您首先必須從其中擴展並告訴它它是什麼模型持有 以及我上面看到的內容是否試圖將您的觀點置於集合中? 這是不可能的,因爲集合包含模型列表,而不是視圖。 但是,您可以創建一個定義您的視圖的模型。

var myView = Backbone.View.extend({}); 
var myModel = Backbone.Model.extend({}); 
var myCollection = Backbone.Collection.extend({ model: myModel }); 

$(function(){ 

    // creating your view 
    var vw = new SomeView(); 

    // creating a model for the view 
    var viewModel = new myModel({ linkedview : vw }); 

    // creating a collection 
    var modelList = new myCollection(); 
    modelList.add(viewModel); 

}); 

它的要點是,你創建一個模型,包含你的視圖的引用,而不是直接添加視圖到集合(這將無法正常工作)

+0

我想我比每個人更好使用**,而不是讓我的代碼更加晦澀難懂。順便說一句,我以前使用過任意JSON對象的集合,它對我來說很好。 – Waseem

+0

是的,但你通常定義一個模型,在收集 所有的JSON然後把它,放在該模型的新實例 – Sander

+0

我發現@Andreas方法更簡單,而不是創建虛擬模型,然後添加到集合很少使用。無論如何感謝您的幫助。 – Waseem