我一直在互联网上寻找在 jquery 中实现观察者模式的示例。
我想要这样
observer1.observe(subject);
observer2.observe(subject);
为观察者定义一些自定义事件回调
observer1.bind('customEvent', function(contextData) {
//Some code
});
observer1.bind('anotherCustomEvent', function(contextData) {
//Some code
});
observer2.bind('customEvent', function(contextData) {
//Some code
});
然后,以下行将触发两个观察者的 customEvent 回调
subject.trigger('customEvent', contextData);
而以下只会在observer1上触发anotherCustomEvent,因为observer2没有绑定该自定义事件
subject.trigger('anotherCustomEvent', contextData);
互联网上的指南更笼统:
$( document ).on( "topicName" , function () {
//..perform some behaviour
});
$( document ).trigger( "topicName" );
(来自http://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjquery的示例)我看不出如何使用上面的代码来完成我正在寻找的东西。
要么我必须这样做(如果我像上面的例子一样保持它):
$(document).on("customEvent", function () {
observer1.trigger("customEvent");
observer2.trigger("customEvent");
});
$(subject).click(function() {
$(document).trigger("customEvent");
});
或者更好一点:
$(subject).click(function() {
observer1.trigger("customEvent");
observer2.trigger("customEvent");
});
无论哪种方式,我都不得不编辑主题点击回调或文档自定义事件回调,而不是告诉观察者订阅主题。
我是否误解了观察者模式,或者有没有办法实现我正在寻找的东西?
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript在那一章的后面稍微提到了发布/订阅模式。这对我来说可能是一种方式,但我错过了示例背后的代码。