2011-12-22 122 views
2

這是後續問題Is publishing/subscribing to events after UI rendering a best practice regardless of framework?,上個月我們問過,因爲我們第一次使用Javascript/ExtJS應用程序訪問了pub/sub路徑。 如果您想從純粹的發佈 - 訂閱角度來看待我的問題,請參閱倒數第二段的第一句,強調的句子。首先有點上下文:有條件訂閱/取消訂閱多個郵件

我們有一個面板,其中包含一個卡片持有一個網格面板的tab面板,和一個面板,其中包含一個窗體過濾網格數據。在beforechangetab事件中,我們添加/刪除共享網格,併發布GRID_TAB_TOGGLED消息以及指示有貨或無貨的標誌,然後網格用適當的數據重新加載。

至於過濾器,我繼承了代碼依賴於只是一種形式,和組合框的選擇基礎上,加載庫存/非庫存數據修改,但現在我們必須保持濾波器狀態的所有 。我最初的想法是使用卡布局來保存庫存或非庫存的過濾器,並在響應相同的GRID_TAB_TOGGLED消息時在這些過濾器之間進行切換。

問題在於,這兩個過濾器表單都需要監聽其他衆多相同的事件。我想我已經確定了一個解決方案,並且正在尋求設計驗證。

我的想法是讓不同的表單能夠確定他們是否是「活躍」(庫存或非庫存)過濾器,並且如果活動,則訂閱所有必要的消息,但如果不活躍,則取消訂閱商場。只要接收到GRID_TAB_TOGGLE消息,就會發生這種取消訂閱,然後重新訂閱。

從ExtJS的角度來看,這看起來像是一個合理的設計,但對我更感興趣(因爲我有近3年的ExtJS經驗,但實施我自己的基於pub/sub的系統只有1.5個月) /訂閱範式的立場?也許這對於基於pub/sub的系統甚至是一種模式(或者,儘管我希望不是,反模式)?

回答

2

我會避免過度訂閱/取消訂閱。如果您完全刪除組件,那麼顯然您應該從所有事件中取消訂閱。但是,當您只是暫時禁用組件時,則應該暫時禁用這些事件。

因此,不是取消所有事件的訂閱,然後重新訂閱它們,而是使用某種介體,它可以將所有事件轉發給我,並允許輕鬆地暫停所有事件。這應該很容易使用Ext.util.Observable的#suspendEvents和#resumeEvents實現。

Ext.define("EventMediator", { 
    extend: "Ext.util.Observable", 
    constructor: function(cmp, events) { 
     this.relayEvents(cmp, events); 
     this.callParent([]); 
    } 
}); 

var med = new EventMediator(grid, ["click", "dblclick"]); 

med.on("click", form.doSomething); 
med.on("dblclick", form.doSomethingElse); 

// When form gets hidden: 
med.suspendEvents();