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