Javascript 简单事件聚合器
我正在寻找一个使用require.js的简单事件聚合器。我有两个模块,一个包含视图模型,另一个包含某种“侦听器”:Javascript 简单事件聚合器,javascript,events,requirejs,eventaggregator,Javascript,Events,Requirejs,Eventaggregator,我正在寻找一个使用require.js的简单事件聚合器。我有两个模块,一个包含视图模型,另一个包含某种“侦听器”: // view model define(['lib/knockout-2.2.1', 'events/aggregator'], function(ko, events){ var squareViewModel = function(contents) { this.click = function(){ events.publ
// view model
define(['lib/knockout-2.2.1', 'events/aggregator'], function(ko, events){
var squareViewModel = function(contents) {
this.click = function(){
events.publish('squareClicked', this);
};
};
return squareViewModel;
});
// some listener of some kind
define(['events/aggregator'], function(events){
events.subscribe('squareClicked', function(e){
alert("hurrah for events");
});
});
有什么东西能做到这一点吗?这种建筑是个好主意吗?这是我第一次尝试客户端架构。我最终使用jQuery创建了自己的:
define([], function(){
return {
publish: function (type, params){
$(document.body).trigger(type, params);
},
subscribe: function(type, data, callback){
$(document.body).bind(type, data, callback);
},
};
});
它可以满足我的需求,但还没有经过广泛的测试
正如ExplaUnit在his中指出的,这将捕获
document.body
上的任何事件。在访问传递的回调函数内部的this
时,我还发现了一个范围问题。这与您发布的内容类似,但我很幸运地扩展了主干事件(实际上,您不必使用任何有关主干的其他内容来实现此功能),类似于:
define(['underscore', 'backbone'], function( _, Backbone ) {
var _events = _.extend({}, Backbone.Events);
return _events;
});
然后您的所有viewmodels(或任何代码)都可以使用它:
define(['knockout', 'myeventbus'], function(ko, eventBus){
return function viewModel() {
eventBus.on('someeventname', function(newValue) {
// do something
});
this.someKOevent = function() {
eventBus.trigger('someotherevent', 'some data');
};
};
});
最初的想法来自于。关于客户端事件,我的另一个最爱是
同样,它与您发布的内容几乎相同。但是,我不喜欢将其绑定到jQuery文档DOM节点的方法,因为可能会有其他类型的事件从子节点冒泡而来,等等。而通过扩展主干事件,您可以拥有自己的专用事件总线(如果您希望有单独的数据事件和UI事件,甚至不止一个)
本例中关于RequireJS的注意事项:主干和下划线不兼容,因此您需要使用一个.加载它们。这就是我最后要做的,但是
Backbone.events
应该为Backbone.events
。显然不能只编辑字符。