Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使组件相互通信的集中式系统_Javascript_Jquery_Events - Fatal编程技术网

Javascript 使组件相互通信的集中式系统

Javascript 使组件相互通信的集中式系统,javascript,jquery,events,Javascript,Jquery,Events,我已经阅读StackOverflow很多年了,但我终于遇到了一个需要帮助的问题,我找不到合适的答案 当前情况: 我有一个自定义JS组件库(如网格、日期选择器、弹出窗口等) 为了使组件能够相互通信,我基于以下两个规则实现了一个发布/订阅机制: 发布者:事件->消息 订户:消息->事件 除此之外,我还使用了相当多的自定义事件(使用jQuery设置),并且有一种方法(使用数据属性)为每个组件定义加载时应触发的事件 例如: 网格在加载时触发“初始化”事件,“初始化”触发“刷新”等 现在,我可以有一个日期

我已经阅读StackOverflow很多年了,但我终于遇到了一个需要帮助的问题,我找不到合适的答案

当前情况: 我有一个自定义JS组件库(如网格、日期选择器、弹出窗口等) 为了使组件能够相互通信,我基于以下两个规则实现了一个发布/订阅机制: 发布者:事件->消息 订户:消息->事件

除此之外,我还使用了相当多的自定义事件(使用jQuery设置),并且有一种方法(使用数据属性)为每个组件定义加载时应触发的事件

例如: 网格在加载时触发“初始化”事件,“初始化”触发“刷新”等

现在,我可以有一个日期选择器,它也可以在加载时触发“初始化” 当datepicker发布网格的“刷新”事件已订阅的消息时,会出现问题。 接下来发生的是:

  • 加载时触发日期选择器“初始化”
  • 初始化值时发生更改,这将触发一个'change'事件
  • 'change'事件会发布一条消息,比如说'date\u changed'
  • 网格侦听消息并触发“刷新”事件
这就是网格的'refresh'事件在'initialize'事件之前被触发的方式,这显然是一个问题

我正在考虑实现某种类型的事件队列,不触发事件,而是将其添加到队列中,然后稍后进行处理,但由于JavaScript基本上是单线程的,因此实现起来有点烦人

问题: 有没有办法解决这个问题?包括上述或任何其他可能的解决方案


非常感谢您抽出时间

如果需要,在每个控件中使用jquery延迟对象进行内部同步如何?我不能给你一个具体的例子,因为我不知道你的代码是如何构造的。例如,您有一个jquery deferred对象,它表示网格组件的“已初始化”状态:将其称为“GridInitialized”。理想情况下,这是封装在网格组件中的。您需要确保在调用date_changed处理程序(或任何其他需要它的处理程序)之前创建此对象。当网格触发它的“初始化”事件时,它调用“gridInitialized.resolve()”


如果gridInitialized处于已解析状态,则会立即调用传递给.done的函数。否则,执行将延迟到调用.resolve。在这两种情况下,处理程序都会立即返回。

每个组件中都有一个标志,表示在初始化之前它不能刷新?例如,如果您试图在初始化elementUse asynchronous events…@Bergi之前将方法传递给某些jQueryUI小部件,则它们会抛出这样的错误-我不确定您指的是什么。你能给出一个例子或一个链接吗?@charlietfl-是的,这是一个快速的解决方案,实现了它,而且似乎工作得很好。我必须添加到刷新事件中:如果未初始化,则首先初始化,如果网格没有自动刷新,则停止。考虑所有的可能性。如果我没有找到一个更优雅的解决方案,那么它很可能会一直保持这种状态that@Bergi-你的意思是像他们一样?有趣的想法。。。我会考虑如何将其应用到我的案例中。基本上,每个控件都只是一些HTML+委托事件。例如,网格是一个带有class=“grid”的表。然后,所有事件都被委托给document.body,以便在以后添加网格时它们可以工作。
The grid's handler for the "date_changed" event contains:

    gridInitialized.done(function() {
       *code that eventually fires the grid "refresh" event*
    });