В чем разница между триггерами и событиями в позвоночнике?

в 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){}
}

путь событий кажется более быстрым и простым, а также облегчает получение самого фактического события (поскольку оно передается автоматически). Есть ли причина использовать одно над другим? Каковы их предполагаемые варианты использования? Имея проблемы с поиском много информации об этом в интернете (кроме попытки grok the аннотированный источник)...

(Я только что открыл метод events, и до сих пор использовал триггеры для всего, так как я думал, что это единственный способ)

2 ответов


ваш первый пример-плохое использование триггеров. Триггеры предназначены для ярлыков для запуска события из представления, чтобы внешний объект мог поймать событие, а не представление, которое вызвало событие.

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


если мы думаем, как events и triggers как объекты Javascript, то вот разница:

событие пример:

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

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

в каждом случае ключ ('click h1') всегда является событием DOM и селектором jQuery,значение ('alertTitle') - это всегда имя функции обратного вызова, существующей внутри представления.

Триггера Пример:

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

в каждом триггере ключ по-прежнему является событием DOM и селектор jQuery,но значение ('alert:title') всегда название нового события, которое вы хотите вызвать. этот обработчик событий может быть определен в любом месте, не обязательно внутри текущего представления.

триггер полезен, когда:

  1. вы хотите, чтобы ваше событие DOM запускало событие Marionette вместо вызова функции обратного вызова;
  2. вы хотите, чтобы обработчик события Marionette находился где-то вне текущего представления, например его родительского представления. В этом случае родитель этого представления может иметь onChildviewAlertTitle() функции для обработки этого alert:title событие.