Javascript 简单事件聚合器

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

我正在寻找一个使用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");
    });
});

有什么东西能做到这一点吗?这种建筑是个好主意吗?这是我第一次尝试客户端架构。

我最终使用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
。显然不能只编辑字符。