木偶事件之间的区别

时间:2014-12-15 12:11:38

标签: events marionette

我正在阅读marionette.js文档,但我不理解ventreqrescommands之间的区别。

我唯一明白的是命令不应该返回任何内容。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:19)

让我们从顶部开始:Backbone.wreqr是Marionette附带的Backbone插件。它为松散耦合的应用程序提供了三种消息传递模式。

此答案包含Backbone.wreqr文档中的示例代码 - 归功于original authors

活动

EventAggregator个对象的工作方式与Backbone.Events类似 - 它们可以启用命名空间事件处理。 vent只是EventAggregator对象的公共变量名称:

var vent = new Backbone.Wreqr.EventAggregator();

vent.on("foo", function(){
  console.log("foo event");
});

vent.trigger("foo");

命令

命令与Events非常相似。区别在于语义 - 事件通知应用程序的其他部分发生了某些事情。命令指示应用程序的另一部分执行某些操作。

var commands = new Backbone.Wreqr.Commands();

commands.setHandler("foo", function(){
  console.log("the foo command was executed");
});

commands.execute("foo");

请求/响应

RequestResponse个对象通常由名为reqres的变量引用,为应用程序组件请求访问对象提供了一种松散耦合的方式:

var reqres = new Backbone.Wreqr.RequestResponse();

reqres.setHandler("foo", function(){
  return "foo requested. this is the response";
});

var result = reqres.request("foo");
console.log(result);

广播和频道

为方便起见,Wreqr提供了一个名为radio的对象,它混合了三种消息模式。命令,事件和请求可以分组为逻辑通道以防止干扰 - 例如,您可能需要saveuser个通道的不同document命令。

在Marionette

Marionette.Application使用常规变量名称在频道(Commands)内创建RequestResponseEventAggregator"global" by default)的实例。如果您需要自定义行为,则可以覆盖ventcommandsreqres变量。

_initChannel: function() {
      this.channelName = _.result(this, 'channelName') || 'global';
      this.channel = _.result(this, 'channel') || Backbone.Wreqr.radio.channel(this.channelName);
      this.vent = _.result(this, 'vent') || this.channel.vent;
      this.commands = _.result(this, 'commands') || this.channel.commands;
      this.reqres = _.result(this, 'reqres') || this.channel.reqres;
    },

Link to source

我建议您阅读Wreqr docs了解更多细节。我还建议阅读Marionette annotated source - 它简洁而且记录完备,实际上包括Wreqr源。

N.B。 Marionnette的下一个主要版本v3.x用Radio取代了Wreqr。 Radio提供与Wreqr相同的功能和更清晰的API。可以use Radio in Marionette 2.x applications,如果您要开始使用新应用,我建议使用{。}}。

答案 1 :(得分:3)

ReqRes Messenger

reqres messenger既可以向目标发送消息(由指定的event以及可选参数组成),也可以将响应中继回源(将在目标函数的返回参数的形式)

Command Messenger

commandvent信使在功能上非常相似,但履行不同的语义责任。

command messenger用于调用目标函数的执行。通常,一个函数绑定到command处理程序。与OP所说的一样,在command中,通信的方向是单向的,这意味着无论command目标返回什么,都不会被发送回来自command的源。

VENT Messenger

最后,vent信使是事件聚合器。您可以将许多侦听器附加(订阅)到vent,并且所有侦听器都将收到vent触发(发布)的事件。每个侦听器都将调用与该侦听器关联的函数。当触发ven t中的事件时,它还可以向每个侦听器发送一组参数。