【问题标题】:Conditional subscribing/un-subscribing from multiple messages有条件地订阅/取消订阅多条消息
【发布时间】:2012-01-26 06:32:12
【问题描述】:

这是Is publishing/subscribing to events after UI rendering a best practice regardless of framework? 的后续问题,我在上个月第一次使用 Javascript/ExtJS 应用程序进入 pub/sub 路径时提出了这个问题。 如果您想从纯粹的发布-订阅的角度来了解我的问题的实质,请参阅倒数第二段的第一个强调的句子。首先是一些上下文:

我们有一个面板,其中包含一个选项卡面板,其卡片包含一个网格面板,一个面板包含一个用于过滤网格数据的表单。在 beforechangetab 事件中,我们添加/删除一个共享网格并发布 GRID_TAB_TOGGLED 消息以及一个指示是否有库存的标志,然后网格会重新加载适当的数据。

至于过滤器,我继承的代码仅依赖于一个表单,组合框选项会根据加载的库存/非库存数据进行修改,但现在我们需要保留全部过滤器状态。我最初的想法是使用卡片布局来保存库存或非库存过滤器,并在它们之间切换以响应相同的 GRID_TAB_TOGGLED 消息。

但问题是这两种过滤器形式都需要侦听其他大量相同的事件。我想我已经确定了一个解决方案,并且正在寻求设计验证。

我的想法是让不同的表单能够确定它们是否是“活动”(库存或非库存)过滤器,如果处于活动状态,则订阅所有必要的消息,但如果不活动,则取消订阅 每当收到 GRID_TAB_TOGGLE 消息时,就会发生这种取消订阅、重新订阅的情况。

从 ExtJS 的角度来看,这似乎是一个合理的设计,但我更感兴趣(因为我有近 3 年的 ExtJS 经验,但只有 1.5 个月实现了我自己的基于 pub/sub 的系统),来自发布/订阅范式的观点?也许这甚至是基于 pub/sub 的系统的一种模式(或者,尽管我希望不是,一种反模式)?

【问题讨论】:

    标签: javascript events extjs publish-subscribe


    【解决方案1】:

    我会避免过度订阅/取消订阅。如果您要完全删除一个组件,那么很明显您应该取消订阅它的所有事件。但是当你只是暂时禁用组件时,你也应该暂时禁用事件。

    因此,与其取消订阅所有事件然后再次重新订阅它们,我会使用某种调解器来转发所有事件并允许轻松暂停其所有事件。使用 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();
    

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多