在Backbone Collection上调用invoke

时间:2011-12-13 05:36:56

标签: backbone.js

我已初始化Backbone Collection但在集合上调用调用不起作用。出于某种原因,我得到了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'

似乎我错过了一些非常明显的东西。

注意:我没有兴趣调用每个函数,然后在视图对象上调用刷新,因为那只是笨重。

2 个答案:

答案 0 :(得分:3)

骨干中的集合是模型列表。因此,当您在内部向集合添加视图时,它将调用此类col.add(Backbone.Model.extend(vw))之类的内容。因此,它将创建一个新的模型,您的视图作为构造函数参数。如果您想将视图存储在列表中,只需使用JavaScript数组或更智能的下划线集合

答案 1 :(得分: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);  

});

它的要点是,你创建一个模型,包含对你的视图的引用,而不是直接将视图添加到集合中(这将无法工作)