关于BoilerplateJs的例子,我们应该如何调整这些模块,以便在用户对一个模块进行任何更改后,其他相关模块都应该根据该更改进行更新。
例如,如果有一个模块从用户那里检索名称和销售额的输入,而另一个模块更新表或图中检索到的数据,你能用一些例子解释一下,考虑到事件处理,这些相互连接是如何发生的吗?
谢谢!!
在BoilerplateJS中,每个模块都有自己的moduleContext对象。此模块上下文对象包含两个方法"listen"one_answers"notify"。有关更多详细信息,请查看"/src/core/context.js"中的上下文类。
需要"侦听"事件的组件应通过指定事件和回调处理程序的名称来注册该事件。引发事件的组件应该使用"notify"方法让其他人知道发生了一些有趣的事情(可以选择传递一个参数)。
从GitHub获取最新BoilerplateJS代码的更新。我只是将clickCounter作为一个复合组件进行了修改,其中"clickme组件"引发事件,"彩票组件"监听事件以做出响应。
事件通知代码:
moduleContext.notify('LOTTERY_ACTIVITY', this.numberOfClicks());
监听事件的代码:
moduleContext.listen("LOTTERY_ACTIVITY", function(activityNumber) {
var randomNum = Math.floor(Math.random() * 3) + 1;
self.hasWon(randomNum === activityNumber);
});
我会考虑使用发布-订阅库,如Amplify。使用这种技术,一个模块很容易充当事件的发布者,另一个模块则很容易注册为订阅者,以高度解耦的方式侦听和响应这些事件。
由于您已经在使用Knockout,您可能有兴趣首先尝试Ryan Niemeyer的Knockout邮箱插件。关于这个库的更多背景信息可以在这里找到,包括一个演示小提琴。如果需要,您可以随时稍后切换到Amplify。