16

在 Backbone Marionette 中,您可以使用触发器和事件执行极其相似的操作:

触发器:

return Marionette.Layout.extend({
    triggers: {
        'click .something': 'view:handleClickSomething'
    },

    initialize: function(){
        this.bindTo(this, 'view:handleClickSomething', this.handleClickSomething);
    },

    handleClickSomething: function(){}
}

与事件:

return Marionette.Layout.extend({
    events: {
        'click .something': 'view:handleClickSomething'
    },

    handleClickSomething: function(ev){}
}

事件方式似乎是一种更快更简单的方式,也更容易获得实际事件本身(因为它是自动传递的)。有理由使用其中一个吗?他们的预期用例是什么?很难在网上找到很多关于这个的信息(除了试图了解带注释的来源)......

(我刚刚发现了 events 方法,到目前为止,我一直在为所有事情使用触发器,因为我认为这是唯一的方法)

4

2 回答 2

15

您的第一个示例是触发器使用不当。触发器旨在作为从视图触发事件的快捷方式,以便外部对象可以捕获事件,而不是触发事件的视图。

http://lostechies.com/derickbailey/2012/05/15/workflow-in-backbone-apps-triggering-view-events-from-dom-events/

于 2012-10-29T20:12:34.680 回答
5

如果我们将events和都triggers视为 Javascript 对象,那么区别如下:

事件示例:

events: {
    'click hi': 'alertTitle',
},

alertTitle: function () {
    alert('Title!!');
}

在每个事件中,key ( 'click h1') 始终是一个 DOM 事件和一个 jQuery 选择器,value ( 'alertTitle') 始终是回调函数的名称,存在于视图中。

触发示例:

triggers: {
    'click h1': 'alert:title'
},

在每个触发器中,key 仍然是一个 DOM 事件和一个 jQuery 选择器,但 value ( 'alert:title') 始终是您要触发的新事件的名称。该事件处理程序可以在任何地方定义,不一定在当前视图内。

触发器在以下情况下很有用:

  1. 您希望您的 DOM 事件触发 Marionette 事件,而不是调用回调函数;
  2. 您希望 Marionette 事件的处理程序位于当前视图之外的某个位置,例如其父视图。在这种情况下,此视图的父级可以具有onChildviewAlertTitle()处理此alert:title事件的功能。
于 2016-10-02T01:14:17.577 回答