2012-06-04 23 views
1

有人能解释一下,视图(控制器)的生命周期,比如说,TODO列表应用中的行?backbone.js视图的生命周期,几个初学者问题

App.RowView = Backbone.View.extend({ 
    events:{ 
     "click #del" : "delRow" 
    } 
}); 

大部分的教程中,APPVIEW这样做:

render: function() 
    { 
     this.collection.each(this.renderRow, this); 
     return this; 
    }, 
    renderRow: function(row) 
    { 
     var rowView = new App.RowView({model:element}); 
     this.$('#rows').append(rowView.render().el); 
    } 

问题:

  1. 意思rowView仅使用一次,并设置在renderRow()?还是活着?
  2. 如果为true,何时杀死View?是否将视听者添加到model.destroy并在视图中调用remove()足够好?
  3. 如果我已经有从服务器渲染的行标记,那么click #del事件是否仍然会被捕获并执行一些操作,而不会创建rowView
  4. 不应该'click #del'更好地位于父视图,以便jQuery可以委托和附加行为吗?
  5. 这是否意味着我有每行1 rowView?那是不是意味着每一行都会编译_.template?任何选择?如果有指向它的其他引用

回答

2
  1. 参考死亡的,查看可以保持。
  2. 查看何时不再需要,通常什么时候不再可见。如果你的视图是结合你必须调用remove()之前解除绑定他们的任何事件:Pattern to manage views in backbone
  3. RowView实例必须实例化被捕获的事件。
  4. 这取决于你正在寻找的行为,但在你的例子中,我认为每个View都必须捕获每个自己的click #del事件,如果你在父视图中声明事件你怎么知道该行要删除?
  5. 通常声明视图定义的模板您分配一个编译版本的它this.template像这样:template: _.template("hello: <%= name %>");
+2

Re(1):通过将事件处理绑定到el的'delegate'调用将引用该视图实例。 –

+0

@ muistooshort非常有趣的一点,当我说“如果有其他引用”时,我在明确绑定的事件中想,但我没有想到在DOM绑定事件中。 – fguillen

+1

通过'委托(delegate)'的隐藏引用是当每个人都没有每个实例的'el'时咬人并导致泄漏的隐藏引用。我从经验中知道这一点(当然),如果多个视图共享一个“el”,则必须通过“undelegateEvents”清理那个隐藏的引用。 –