2011-12-22 123 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();