Rails предоставляет различные события ajax из коробки. (Больше информации можно найти здесь - https://github.com/rails/jquery-ujs/wiki/ajax, исходный код можно найти здесь - https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L125)
Теперь у меня есть собственный виджет с двумя _on()
методами _on()
. Вот фрагмент кода, который имеет значение:
_create: function() {
this._on(this.document, {
"ajax:beforeSend #some-form": function(event, xhr, settings) {
return console.log("Before send");
}
});
this._on({
// Event listeners for widget local events
});
}
Я пришел к тому, что у меня есть два _on()
и оба они работают. Сначала мы слушаем все события, которые происходят внутри document
(так что если бы у меня было что-то действительно тривиальное, как событие click *
это будет работать), а во втором - только события, запущенные в виджетах.
Если я связываю обратный вызов рельсов непосредственно с элементом в функции $(document).ready
все работает отлично. Проблемы ajax:beforeSend
, когда я пытаюсь добавить прослушиватель событий для rails ajax:beforeSend
, ajax:success
и другие подобные события в первый _on()
- он просто не работает.
Любые идеи, как жениться на событиях rails на jquery-ui widget event listener? Благодарю.
Если вы посмотрите код _on()
в пользовательском интерфейсе jQuery, вы увидите, что он использует regexp /^(\w+)\s*(.*)$/
чтобы получить имя и селектор событий:
var match = event.match( /^(\w+)\s*(.*)$/ ),
eventName = match[1] + instance.eventNamespace,
selector = match[2];
Очевидно, он видит ваш желаемый ajax:beforeSend
как просто ajax
и selector вроде :beforeSend #some-form
и не запускающий обработчик.
В настоящее время принято делать имена событий с двоеточием внутри, поэтому может быть хорошей идеей отправить запрос на тяну.
Тем временем вы можете регистрировать глобальные обработчики для желаемых событий и перезапускать их с разными именами без внутреннего двоеточия.