javascript - 无论框架如何,在 UI 呈现最佳实践后发布/订阅事件是否是最佳实践?

标签 javascript events user-interface extjs publish-subscribe

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

this.filter.on('filterUpdated', function(filter, params)

我已经开始将代码转换为使用 pub/sub 范例,以减少对象与其特定事件名称之间的耦合,但在 initComponent 中发布和/或订阅事件时很快遇到问题(在 ExtJS 中在渲染之前执行)。当屏幕首次加载时,我需要从最高级别的组件触发一个“INIT”事件,并且我要么收到错误(由于 ExtJS"template"没有像原来那样呈现),要么事件根本没有触发.

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

    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);

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

这是在事件驱动的 UI 中实现发布/订阅的普遍接受的方式吗?连框架都不管?也就是下面2条好的原则,还是它们的其他方式?

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

提前致谢

最佳答案

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

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

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

关于javascript - 无论框架如何,在 UI 呈现最佳实践后发布/订阅事件是否是最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159385/

相关文章:

javascript - Flux 组件个人商店

javascript - FireFox 键盘事件按钮

javascript - 如何从 Mathquill Matheditor 输出为 LaTeX?

javascript - d3 图表调整大小无法按预期工作

javascript - 窗口加载后的 element.onclick 事件在 javascript 中不起作用

java - 在 Android 3.0 之前拖放?

android - 如何到达 ListView 的底部,加载更多项目

javascript - Node js 事件监听器未按预期工作

c++ - C++/Tk 与 Tk 8.5 兼容吗?

java - 哪些 MVC 框架可用于 Java 桌面/winform 应用程序?