Stickit: Как вызвать событие изменения после каждой модели -> просмотреть изменение
У меня есть много событий, связанных с элементами в моем представлении, хотя когда я использую stickit js для изменения значений в моем представлении путем изменения модели, это не вызывает событие onChange.
Есть ли способ, которым я могу вызвать событие onchange для текущей модели: element после установки значения в модели без необходимости писать обработчик для каждой привязки? Это будет для всех элементов формы, input / select / textarea.
Я хочу избежать следующего для каждого элемента формы на странице:
bindings: {
'#foo': {
observe: 'foo',
afterUpdate: 'forceChange'
},
'#bar': {
observe: 'bar',
afterUpdate: 'forceChange'
},
...
},
forceChange: function(el) { jQuery(el).change() }
2 ответа
Одним из возможных способов взлома (только с версией 0.6.3) было бы определение глобального обработчика, который соответствует всем элементам:
Backbone.Stickit.addHandler({
selector: '*',
afterUpdate: function($el) {
$el.trigger('change');
}
});
Поскольку обработчики смешиваются с другими соответствующими конфигурациями обработчиков и привязок в порядке их определения, вы не можете использовать afterUpdate
в любой из ваших привязок без перезаписи этого глобального, полностью совпадающего обработчика, так как конфигурации привязок являются последними для смешивания. Вы можете прочитать больше об этом здесь.
Аааа, этот комментарий проясняет вопросы. Таким образом, в Javascript, когда вы изменяете значение ввода "вручную" (будь то через JQuery или через someElement.value =
) как вы заметили, браузер не будет запускать событие изменения. События изменений (и большинство других событий в этом отношении) запускаются только в ответ на действия пользователя, а не на Javascript.
К счастью, так же, как вы можете "вручную" изменить значение, вы также можете "вручную" вызвать событие. В jQuery синтаксис для этого:
$(yourElement).trigger('change');
Если вам нужно контролировать такие вещи, как e.target
вы можете прочитать на JQuery trigger
документация для деталей, но это основная идея.
Вы даже можете связать изменение значения и запуск события вместе, если хотите:
$(yourElement).val('newValue').trigger('change');