我正在玩Backbone.js
和Backbone.Marionette
,我想知道trigger
和triggerMethod
之间有什么区别。
特别是,有什么经验法则可以决定何时使用前者或后者?
例如,在我看来,事件对于DOM元素及其视图之间的通信非常有用。
在Marionette中使用 triggerMethod
来更新级联的不同组件,例如:布局将show
方法调用给其子级(子级响应onShow
)。所以,对我而言,与调用直接方法相同。这是真的吗?
trigger
怎么样?
提前谢谢你。
答案 0 :(得分:12)
没有太大的区别,它只取决于你想做什么......
trigger
会触发一个事件triggerMethod
将根据命名约定触发事件 AND 调用相应的方法(请参阅https://marionettejs.com/docs/v2.1.0/marionette.functions.html#marionettetriggermethod)显然,如果您只想触发某个事件,则可以使用trigger
。但是使用trigger
你还可以创建一个“自制的”triggerMethod实现:trigger
该事件,然后有一个监听器来调用你想要的函数。
那么triggerMethod
呢?如上所述,它将触发事件并调用方法。因此,如果您的唯一目标是首先调用该方法,则不一定需要使用triggerMethod
。
那么为什么要使用triggerMethod
呢?因为它为您提供了“钩子”来添加事件侦听器的功能。例如,在我的book on Marionette中,https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/edit/edit_controller.js#L24中有一个triggerMethod
调用,用于在表单上显示错误消息。只需调用
view.onFormDataInvalid(contact.validationError);
但如上所述,triggerMethod
为我们提供了一个“钩子”供以后使用。例如,假设我想添加用户错误的记录:我可以简单地在我的视图中添加一个监听器:
initialize: function(){
this.on("form:data:invalid", function(validationError){
// log error here
}
}
可以添加此附加功能而不会影响其余代码,因为我们使用triggerMethod
而不是直接方法调用。此外,以后测试更容易(小测试,单点故障):
答案 1 :(得分:8)
trigger(name)
Backbone.js
triggerMethod(name)
Marionnete.js
trigger(name)
所做的一切还使用预定义的命名约定调用方法。
例如。 triggerMethod('foo')
会致电onFoo()
例如。 triggerMethod('foo:bar')
会致电onFooBar()