简单事件聚合器
问题描述:
我正在寻找一个与require.js一起工作的简单事件聚合器。我有两个模块,包含一个视图模型,另外一某种“监听器”:简单事件聚合器
// 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");
});
});
是那里有什么,做这个?这种架构是一个好主意吗?这是我第一次进入客户端体系结构。
答
这类似于你贴什么,但我已经有好运气延伸骨干事件(你实际上并没有使用什么对主干这个工作),像这样:
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');
};
};
});
最初的想法来自this article by Derick Bailey。我在客户端事件上的其他最爱之一是this one by Jim Cowart
同样,它与您发布的内容几乎相同。然而,我不喜欢将它绑定到jQuery文档DOM节点的方法是,您可能还有其他类型的事件通过那里飞行,从子节点等冒出来,而通过扩展主干事件可以拥有自己的专用事件总线(如果您想要单独的数据事件与UI事件,甚至可以有多个)。
关于本例中RequireJS的注意事项:Backbone和Underscore不兼容AMD,所以您需要使用shim config加载它们。
答
我结束了使用jQuery让我自己:
define([], function(){
return {
publish: function (type, params){
$(document.body).trigger(type, params);
},
subscribe: function(type, data, callback){
$(document.body).bind(type, data, callback);
},
};
});
它适用于我想要它,但它并没有被广泛的测试。
正如explode在他的answer中指出的那样,这将捕获document.body
上的任何事件。在传递回调函数内部访问this
时,我还发现了一个范围问题。
这就是我最终做的,但是'Backbone.events'应该是'Backbone.Events'。显然不能编辑字符。 – sennett 2013-04-25 04:52:02
@sennett谢谢,编辑答案 – explunit 2013-04-25 12:43:24