简单事件聚合器

简单事件聚合器

问题描述:

我正在寻找一个与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加载它们。

+0

这就是我最终做的,但是'Backbone.events'应该是'Backbone.Events'。显然不能编辑字符。 – sennett 2013-04-25 04:52:02

+0

@sennett谢谢,编辑答案 – explunit 2013-04-25 12:43:24

我结束了使用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时,我还发现了一个范围问题。