Backbone.Radio:命令和请求优于事件的优点

时间:2015-04-15 05:22:22

标签: javascript backbone.js marionette backbone-events

似乎Backbone.Radio提供了2个新的抽象 - 命令和请求。它们与Backbone.Events几乎完全相同,只是它们只能有1个用户。是这样,如果是这样的话,它们对事件有什么好处?

我计划将Backbone.Events/Radio与React.js一起使用,如果有帮助的话。

2 个答案:

答案 0 :(得分:5)

我实际上并没有使用Backbone.Radio,而是广泛使用Backbone.wreqr https://github.com/marionettejs/backbone.wreqr,它提供了几乎相同的命令服务。

在我的使用中,事件和命令之间的区别是:

对于要工作的事件,事件的发送者和接收者必须同时存在并且彼此具有引用,并且接收者必须能够正确地处理事件。在完全异步的浏览器环境中,这通常会出现问题,因为应用程序的不同部分同时运行。

命令允许您解耦发送方和接收方。一个对象,比如一个View A,可以简单地发送命令' update_user_details'。

我的第二个对象视图B为" update_user_details'设置命令处理程序。这将改变屏幕上的用户详细信息。

但是,如果View B尚不存在,或者尚未呈现,那该怎么办呢?在事件监听器模式中,您必须确保View A存在,它将对自身的引用传递给View B,然后在View B中附加事件监听器。

使用命令它不是问题,View A发送命令,如果没有人设置了处理程序,那么没有任何不好的事情发生,该命令什么都不做。

当View B出现时,完全独立于View A,它设置了一个处理程序,并将响应所有未来的命令。

关于意图的最后一点说明:

事件模式可以通过以下方式加以考虑:我,View A刚刚做了一些事情,任何有兴趣的人(事件听众)都可以做他们喜欢的事情,我认为不要关心什么你这样做。

在命令模式中:我查看A希望有人做某事,我不在乎是谁做的,我只是想做得对。

答案 1 :(得分:3)

频道。 Backbone.Radio与普通香草Backbone.Events的关键区别在于,它让您可以设置您的代码可以调入的频道'例如来自文档:

var userChannel = Backbone.Radio.channel('user');

这意味着您的代码中的逻辑功能或应用只能在特定频道上发出和处理事件 - 即使您发出具有相同名称的事件,如果它们位于您赢得的不同频道上交叉感染。这与代码中职责分离的原则很吻合。

另一个不同之处,恕我直言,它的微妙,更多地与编码的优雅而不是任何真正的功能差异,是,如果你告诉某些事情做出回应一个事件然后它真的是一个命令,Backbone.Radio允许你将这类事件分成这种类型。类似的逻辑适用于请求类型。

为了完整......

文档还解释了Channel是一个混合了所有三种类型的消息(事件,命令和请求)的对象。你将它混合成一个对象(我使用Marionette,所以我混合到一个实例中Marionette.Object)使用Underscore / Lo-Dash的.extend():

_.extend(objectToBeExtended, Backbone.Radio.Requests);

当然,对于命令也一样。事件的语法是不同的,因为它们被烘焙到Backbone本身,所以第二个参数只是Backbone.Events。

相关问题