Javascript 使组件相互通信的集中式系统
我已经阅读StackOverflow很多年了,但我终于遇到了一个需要帮助的问题,我找不到合适的答案 当前情况: 我有一个自定义JS组件库(如网格、日期选择器、弹出窗口等) 为了使组件能够相互通信,我基于以下两个规则实现了一个发布/订阅机制: 发布者:事件->消息 订户:消息->事件 除此之外,我还使用了相当多的自定义事件(使用jQuery设置),并且有一种方法(使用数据属性)为每个组件定义加载时应触发的事件 例如: 网格在加载时触发“初始化”事件,“初始化”触发“刷新”等 现在,我可以有一个日期选择器,它也可以在加载时触发“初始化” 当datepicker发布网格的“刷新”事件已订阅的消息时,会出现问题。 接下来发生的是:Javascript 使组件相互通信的集中式系统,javascript,jquery,events,Javascript,Jquery,Events,我已经阅读StackOverflow很多年了,但我终于遇到了一个需要帮助的问题,我找不到合适的答案 当前情况: 我有一个自定义JS组件库(如网格、日期选择器、弹出窗口等) 为了使组件能够相互通信,我基于以下两个规则实现了一个发布/订阅机制: 发布者:事件->消息 订户:消息->事件 除此之外,我还使用了相当多的自定义事件(使用jQuery设置),并且有一种方法(使用数据属性)为每个组件定义加载时应触发的事件 例如: 网格在加载时触发“初始化”事件,“初始化”触发“刷新”等 现在,我可以有一个日期
- 加载时触发日期选择器“初始化”
- 初始化值时发生更改,这将触发一个'change'事件
- 'change'事件会发布一条消息,比如说'date\u changed'
- 网格侦听消息并触发“刷新”事件
非常感谢您抽出时间如果需要,在每个控件中使用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*
});