Backbone.js 骨干网。用于组件间通信的无线电

Backbone.js 骨干网。用于组件间通信的无线电,backbone.js,marionette,messaging,Backbone.js,Marionette,Messaging,假设我在一个页面上有两个组件,用户可以与其中一个进行交互,而另一个应该更新,比如说: component A | component B | - option 1 link | "stuff related to option 1" - option 2 link | 现在,当我们单击选项2链接时,我们希望组件B更新 木偶技术使用(或将在下一个主要版本中使用) 我想知道最好的方法。我想到两件事: 1:在两个组件中使用相同

假设我在一个页面上有两个组件,用户可以与其中一个进行交互,而另一个应该更新,比如说:

 component A       |   component B
                   |
 - option 1 link   |   "stuff related to option 1"
 - option 2 link   | 
现在,当我们单击选项2链接时,我们希望组件B更新

木偶技术使用(或将在下一个主要版本中使用)

我想知道最好的方法。我想到两件事:

1:在两个组件中使用相同的通道

//组件A
// ...
onOptionClick:函数(evt){
Backbone.Radio.channel('AvsB').request('update:b',{id:this.model.get('id')});
}
//B部分
// ...
初始化:函数(){
主干.Radio.channel('AvsB')。回复('update:b',function(){
//更新内容。。。
}
}
2:通过使用中介,进一步解耦,例如:组件应该只使用“自己的”通道

//组件A
// ...
onOptionClick:函数(evt){
Backbone.Radio.channel('compA').request('option:isUpdated',{id:this.model.get('id')});
}
//中介(例如main.js、控制器或任何高级对象)
var channelCompA=Backbone.Radio.channel(“compA”);
var channelCompB=主干无线信道(“compB”);
channelCompA.reply('option:isUpdated',channelCompB.request('content:shouldUpdate');
//B部分
// ...
初始化:函数(){
主干.Radio.channel('compB').reply('content:shouldUpdate',function(){
//更新内容。。。
}
}

选项2的工作量更大,似乎有点不必要。但我真的无法摆脱选项1仍然太具体的感觉。毕竟,组件a不应该关心组件B的存在。

我认为选项2是不必要的复杂

基本上,您要问的是事件聚合器模式还是中介器模式在这里更合适。需要记住的主要问题是,它们都是紧密耦合的解决方案。在您的示例中,这一点不清楚,因为您是以组件(
“update:b
”)命名请求的.这是耦合的来源,而不是你使用同一个通道的事实

更具体地说,如果组件A和组件B真的不需要相互了解,那么它们的名称不应该是作为请求名称的API的一部分。请求应该以应该完成的实际工作命名(
performUpdate
),而不是以谁在做工作命名

当然,出于组织或名称空间的目的使用不同的通道仍然是有意义的。而且中介模式肯定有它的用途(例如,如果您需要它来拦截请求并以某种方式更改它们)。但是使用它只是为了盲目地路由请求以避免耦合是没有意义的


你可能会发现《木偶网》的创作者很有趣,因为它讨论了同样的问题。

是的,你是对的,选择合适的名称(总是很难)并选择选项1是最好的选择。感谢你帮助我将想法转向一个方向;)我重构了我的代码,现在看起来更干净了。很好。