我正在阅读marionette.js文档,但我不理解vent
,reqres
和commands
之间的区别。
我唯一明白的是命令不应该返回任何内容。
有人可以解释一下吗?
答案 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
的对象,它混合了三种消息模式。命令,事件和请求可以分组为逻辑通道以防止干扰 - 例如,您可能需要save
和user
个通道的不同document
命令。
Marionette.Application
使用常规变量名称在频道(Commands
)内创建RequestResponse
,EventAggregator
和"global" by default)
的实例。如果您需要自定义行为,则可以覆盖vent
,commands
和reqres
变量。
_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;
},
我建议您阅读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 command
和vent
信使在功能上非常相似,但履行不同的语义责任。
command
messenger用于调用目标函数的执行。通常,一个函数绑定到command
处理程序。与OP所说的一样,在command
中,通信的方向是单向的,这意味着无论command
目标返回什么,都不会被发送回来自command
的源。
VENT
Messenger 最后,vent
信使是事件聚合器。您可以将许多侦听器附加(订阅)到vent
,并且所有侦听器都将收到vent
触发(发布)的事件。每个侦听器都将调用与该侦听器关联的函数。当触发ven
t中的事件时,它还可以向每个侦听器发送一组参数。