В чем разница между триггерами и событиями в позвоночнике?
в 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 ответов
ваш первый пример-плохое использование триггеров. Триггеры предназначены для ярлыков для запуска события из представления, чтобы внешний объект мог поймать событие, а не представление, которое вызвало событие.
если мы думаем, как 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'
) всегда название нового события, которое вы хотите вызвать. этот обработчик событий может быть определен в любом месте, не обязательно внутри текущего представления.
триггер полезен, когда:
- вы хотите, чтобы ваше событие DOM запускало событие Marionette вместо вызова функции обратного вызова;
- вы хотите, чтобы обработчик события Marionette находился где-то вне текущего представления, например его родительского представления. В этом случае родитель этого представления может иметь
onChildviewAlertTitle()
функции для обработки этогоalert:title
событие.