2012-09-04 37 views
1

我有一個非常複雜的Backbone應用程序,包含許多視圖/模型和集合。router backbone.js處理事件

當用戶點擊按鈕時,我需要更新多個集合並更新某些視圖。

爲了管理集合我已經處理了我的路由器中的大部分事件。事件的順序如下:

用戶點擊一個鏈接/按鈕,查看觸發事件:如有必要,

this.model.trigger('someEvent'); 

模型聽的情況下,更新自己,通過我的eventbus

通知路由器
eventbus.trigger('globalEVent'); 

我的路由器正在偵聽全局事件,從緩存存儲中獲取集合/模型並更新必要的集合和模型。

這真的很好,到目前爲止的工作,但

我有太多的事件和我的路由器代碼變得難以管理。我的問題是有辦法處理路由器之外的事件,並仍然訪問路由器內的方法?我的方法是否正確或者是否有更優雅的解決方案,我沒有考慮過?

更新:

以下是我現在就做:

在路由器我把這個方法在我的初始化():

 registerModules : function() { 
      var self = this; 
      Backbone.trigger(Events.RegisterModule, function(moduleRoutes) { 

      _.each(moduleRoutes, function(moduleRoute) { 
       self.routeDetails[moduleRoute.name] = { 
        buildPageUrl: moduleRoute.buildPageUrl, 
        fragment : moduleRoute.fragment 
       } 
       self.route(moduleRoute.fragment, moduleRoute.name, moduleRoute.action); 
      }); 

      }); 
     }, 

然後,我有定期自我EXEC塊對於每個自我註冊的模塊/頁面(簡化版):

(function() { 

    var module = { 

      loadAndDisplay: function() {}, 
      saveAndContinue: function(model) { 

       Backbone.trigger(Events.ChangePage, model.get('nextPage')); 

      }, 
      registerEvents: function() {}, 
      _init: function() { 
       module.registerEvents(); 
       var self = this, 
        routes = [{ 
         fragment: Constants.FRAGMENT, 
         name: Constants.PAGE_NAME, 
         buildPageUrl: function() { 
          return Constants.FRAGMENT; 
         }, 
         action: module.loadAndDisplay 
        }]; 

       Backbone.on(Events.RegisterModule, function(registerCallback) { 
        registerCallback.call(registerCallback, routes); 
       }); 
      } 
     }; 

    module._init();  

})(); 

當然你的路由器腳本應該在你的模塊代碼之前加載。它適用於我的需求。採用這種設計,我已將路由器/模塊完全分開,並且彼此之間也不知情。每個將處理它自己的事件/數據等共享邏輯進入路由器。

+0

您需要訪問哪些方法? – jakee

回答

1

你應該將路由器的功能分成不同的類。在我們的基於Marionette的應用程序中,我們使用RegionManager來處理所有視圖相關的內容,例如在不同區域中更改視圖,打開覆蓋層等和StateMachine。路由器本身只是觸發不同的事件,如狀態:更改或區域:更改管理器類監聽的地方。

這樣做,你可以有一個不同的經理類來處理你的應用程序的特殊方面。讓路由器爲他構建:監聽位置更改事件並通知應用程序。這個路由器不應該有其他的邏輯。

+0

我已經轉向了你提出的方法。謝謝 – iririr