2012-04-13 66 views
2

什麼是更有效率,使用事件在嵌套視圖之間進行通信,或保持參考調用方法。以下示例顯示了兩個視圖。外部視圖響應點擊事件,然後可以使用事件或方法調用來讓InnerView作出適當的響應。Backbone.js嵌套視圖:引用還是事件?

InnerView = Backbone.View.extend({ 

    initialize: function() { 
     this.model.bind('doSomethingEvent', this.doSomething); 
    }, 

    doSomething: function() { 
     // This could have been called from event/trigger 
     // or from direction method invocation using reference. 
    } 
}); 


OuterView = Backbone.View.extend({ 

    events = { 
     'click' : 'handleOutViewClick' 
    }, 

    render: function() { 

     // Create InnerView to render some model 
     var innerView = new InnerView({model:this.model }); 

     $(this.el).append(innerView.render().el); 

     // Could store a reference to the View? 
     this.viewRef = innerView; 
    }, 

    handleOutViewClick: function(e) { 

     // Should this function use a reference to the InnerView instance: 
     this.viewRef.doSomething(); 

     // Or should it trigger an event on this.model that 
     // the InnerView is bound to? 
     this.someCollection.trigger('doSomethingEvent'); 
    } 
}); 

回答

4

可能是一個單個方法調用將是不是一個事件調度,這將涉及至少2的方法調用更有效。但我認爲你不需要擔心技術上哪個更「高效」。除非這種情況每秒發生多次,否則您只能關心使用更清晰,更正確的代碼的原因。我認爲最清潔的模式取決於傳達的細節。這是我的偏好:

  1. 如果是天作之合outerview操縱模型和集合,並有innerview通過正常的骨幹模型/收集事件作出迴應,這是最乾淨的。

  2. 如果發生的事情並不是真的關於模型,請考慮一個「視圖模型」模式,您可以將視圖的有趣狀態模型化爲後端模型,即使您無意永遠不要讓這個模型與服務器交互。然後將兩個視圖綁定到來自視圖模型的事件,並通過修改常見的「視圖模型」實例來協調它們。這是一種我用於複雜視圖的模式,其中有許多相互依賴的狀態與服務器的底層模型沒有直接關聯。

  3. 如果發生的事情並不真正改變模型/集合,更多的是特定於視圖的事情,直接方法調度將更加直接,但也更加緊密耦合。決定何時由事件分派提供的鬆耦合值得追加複雜性和難以遵循的控制流程,這取決於您的判斷。