2014-06-10 47 views
1

我有一个视图,我在两个单独的选项卡上创建了两次。在这个视图的每个实例中,我都有一些子视图。每次创建父视图时,都会在其内部创建新的子视图。与此同时,它会将这些子视图数组被调用,如:在主干中正确销毁视图时出现问题

var ParentView = Backbone.View.extend({ 
     itemViews: [], 

     initialize: function(options) { 
      var self = this; 

      // following creates the specific collection of data 
      // is this what I should be using to destroy the subviews 
      // rather than the itemViews array? 
      this.collection = options.collection; 
      this.collection.on('add', self._createSubView, self); 

     render: function(){// render stuff}, 

     _createSubView: function() { 
      view = new SubView(); 
      this.itemViews.push(view); 
     }, 
    }); 

的问题是,中的父视图中的一个,有时,我需要摧毁它的子视图。这是通过做:

_.each(self.itemViews, function (view) { 
     Utils.destroyView(view); // Utility function that destroys the views. 
    }); 

的问题,我面对的是,每次我实例化一个新的父视图,而不是创建一个新的阵列itemViews,骨干就追加到一个叫itemViews整个阵列,就如同每个两个父视图共享相同的itemViews数组。因此,不仅仅是破坏适当的选项卡的视图,而是破坏两个选项卡的视图。有没有:

  • 更好的方式来创建子视图的列表,使每个列表是唯一的父视图?
  • 比使用这种类型的列表销毁父视图的子视图更好的方法?

谢谢!

+0

还有一些代码会有帮助。如何调用_createSubView?你从哪里调用'_.each'循环来销毁视图?一个jsfiddle会更好。 –

+0

@NiranjanBorawake谢谢!添加了代码以显示'_createSubView'调用。 _.each是一个重置无限滚动的函数,因为子视图中的项目使用过滤器进行修改,所以我需要在视图修改时重置视图中的项目。让我知道如果你需要更多,我会粘贴jsfiddle! – YPCrumble

回答

1

您需要实例化itemViews属性,因此它是属于一个视图实例

你应该这样做在你的initialize功能如下:

initialize: function(options) { 

    this.itemViews = []; 

    // rest of initialize code 

} 

这应该使itemVews表现你所期望的方式。