2011-11-04 16 views
7

不要/不要のビューを削除するすべてのバックボーンビューに対して、簡単なclose()メソッドを実装しました。Backbone.js:親ビューと子ビューでガベージコレクションを実行する方法

Backbone.View.prototype.close = function() { 
    if (this.onClose) { 
     this.onClose(); 
    } 
    this.remove(); 
    this.unbind(); 
}; 

NewView = Backbone.View.extend({ 
    el: '#List ul', 
    initialize: function() {}, 
    render: function() { 
     _(this.collection.models).each(function(item) { 
      this.renderChildren(item); 
     }, this); 
    }, 
    renderChildren: function(item) { 
     var itemView = new NewChildView({ model: item }); 
     $(this.el).prepend(itemView.render()); 
    }, 
    onClose: function() { 
     this.collection.reset(); 
     // I want to remove the child views as well 
    } 
}); 

NewChildView = Backbone.View.extend({ 
    tagName: 'li', 
    render: function() { 
    } 
}); 

親ビューを削除すると、ここですべての子ビューも削除したいと考えています。すべてのアイデアはどのように私はこのようなモデルをループせずにこれを行うことができますすることができます....

_(this.collection.models).each(function(item) { 
     item.close(); 
    }, this); 

答えて

10

私はあなたのモデルに影響を与えずに、ビュー層にビューの除去を維持する必要がありますほとんどの場合だと思います。

たとえば、コメント付きのビューを削除した場合、アプリ内の別のビューにコメントや統計情報が表示され、コレクションをリセットするとビューにも影響が及ぶ可能性があります。

だから私は(唯一の関連するメソッドが含まれている)あなたがビューですべてを維持すべきだと思う:

NewView = Backbone.View.extend({ 
    initialize: function() { 
     this.childViews = []; 
    }, 
    renderChildren: function(item) { 
     var itemView = new NewChildView({ model: item }); 
     $(this.el).prepend(itemView.render()); 
     this.childViews.push(itemView); 
    }, 
    onClose: function() { 
     _(this.childViews).each(function(view) { 
     view.close(); 
     }); 
    } 
}); 
+0

+1のおかげでたくさんのDIRAを。 – vikmalhotra

関連する問題