2012-08-22 61 views
1

我相信在數據驅動的編程範例中,路由器和視圖應該彼此隔離,並且它們只能通過它們都訂閱的模型更改來相互通信。視圖和路由器之間的骨幹關係

但是,網上的各種教程都以不同的方式做到這一點。我看到了在路由器的initialize方法內實例化視圖的代碼,因此給路由器一種訪問視圖的方法。我還看到了將路由器傳遞給視圖的代碼,以便視圖可以監聽路由器路由事件上的更改。

我不相信任何一種方法都是正確的,因爲它打破了關注的分離。由於我是Backbone的新手,有更多經驗豐富且知識淵博的人可以證實嗎?

回答

0

我沒有看到使用路由器實例化視圖的任何問題,實際上是我用來工作的方式。路由器檢測到新的URL和分離任何未使用查看和實例化請求的。

將路由器引用傳遞給視圖可能更加醜陋,不要說太多的努力來保持引用在視圖和子視圖之間傳播。

但在另一方面視圖必須能夠將信號發送到路由器來改變導航所以我也去了簡單的方法,使路由器在我的應用程序的所有元素全局可見,我可以打電話App.router.navigate()從任何視圖,而不必記得明確傳遞參考。這個決定可以得到捍衛,因爲在任何Backbone應用程序中只允許有一個路由器實例。

+0

謝謝!幾點意見: 1)而不是App.router.navigate,你可以使用Backbone.history.navigate。從Backbone源代碼,我相信這是使Backbone.history成爲全局實例的意圖。 –

+0

2)我相信在我看到的大多數Backbone代碼中,讓路由器實例化視圖是最常見的方法。但是,我認爲這是不理想的,因爲它不必要地將觀點與路由器結合在一起。 –

+0

3)我已經非常成功地讓視圖和路由器通過模型中的變化進行通信,並且這是一種將兩者完全分離的方法。我認爲這是主要的方式,但我在實踐中看不到足夠的,因此這個問題。 –

0

在一些項目中,我使用了全局事件調度程序,它將路由事件傳遞給視圖。

window.Dispatcher = _.extend({}, Backbone.Events); 

在路由器可以綁定到'all'事件捕獲route:*事件:

initialize: function() { 
    this.bind('all', this.onRoute); 
}, 
onRoute: function(route) { 
     Dispatcher.trigger(route); 
} 

在你的意見,你可以綁定到調度事件和應對路線的變化:

initialize: function() { 
    Dispatcher.on('route:index', this.onIndex, this) 
} 

這與在路由更改時更改模型類似,但我覺得這更容易管理,並且不需要將路由器傳遞給v IEWS。不知道這是否是正確的方法,但是Backbone也可以讓你以許多不同的方式做事。

+0

我也在想這個,但是你只是將通信依賴從_Router_移動到新的_Dispatcher_元素。我喜歡_EventAggregator_模式,但在這種情況下,我會將它看作另一個不必要的圖層。另一方面,_who首先實例化視圖?_ – fguillen