Javascript 无论框架如何,在UI呈现后发布/订阅事件都是最佳做法吗?

Javascript 无论框架如何,在UI呈现后发布/订阅事件都是最佳做法吗?,javascript,events,user-interface,extjs,publish-subscribe,Javascript,Events,User Interface,Extjs,Publish Subscribe,我继承了一个相当大的Javascript/ExtJS3代码库,在调用“…superclass.initComponent.apply(this,arguments)”之后,在重写的initComponent方法中有许多调用事件的实例。正在以如下方式对特定对象调用特定事件: this.filter.on('filterUpdated', function(filter, params) 我已经开始将代码转换为使用pub/sub范式,以减少对象与其特定事件名称之间的耦合,但在initCompone

我继承了一个相当大的Javascript/ExtJS3代码库,在调用“…superclass.initComponent.apply(this,arguments)”之后,在重写的initComponent方法中有许多调用事件的实例。正在以如下方式对特定对象调用特定事件:

this.filter.on('filterUpdated', function(filter, params)
我已经开始将代码转换为使用pub/sub范式,以减少对象与其特定事件名称之间的耦合,但在initComponent中发布和/或订阅事件(在ExtJS中,在呈现之前执行)时很快就会遇到问题。当屏幕第一次加载时,我需要从最高级别的组件触发一个“INIT”事件,我要么得到一个错误(由于ExtJS“templates”没有按原来的方式呈现),要么根本没有触发事件

然后,我在Ext.Component的ExtJS源代码(所有组件都从中扩展)中阅读了以下内容,我有一个“啊哈”的时刻:

当我切换到从最顶层组件的afterRender方法发布“INIT”事件,并从其afterRender方法订阅所有其他组件的所有事件时,一切都按照我的预期进行。现在我只是想知道,主要是为了验证我的设计

这是在事件驱动UI中实现发布/订阅的普遍接受的方式吗?甚至不考虑框架?也就是说,以下两条是好的原则,还是它们的其他方式

  • “初始化事件”应在所有子组件渲染后发布
  • 所有子组件在渲染后都应订阅所有事件(为了安全起见)

  • 提前感谢

    您必须平衡事件处理的开销与丢失重要事件的可能性。在js/DOM中,土地状态是可变的

    对于您的#1,如果您可以确定所有子组件都已渲染和订阅的时间点,则触发init事件是有意义的

    对于#2,似乎每个人都可以安全地倾听事件;然而,这可能会减慢速度。如果性能问题很明显,您可能必须决定您不关心的事件,并避免订阅

        if (this.tpl) {
            if (!this.tpl.compile) {
                this.tpl = new Ext.XTemplate(this.tpl);
            }
            if (this.data) {
                this.tpl[this.tplWriteMode](contentTarget, this.data);
                delete this.data;
            }
        }
        this.afterRender(this.container);