Мне понравился ответ @Marc Schütz о переопределении $.rails.allowAction
большинства всего, что я нашел в Интернете - но я не большой поклонник переопределения функциональности в allowAction
, так как она используется повсеместно в кодовой базе jquery-ujs(что если есть побочные эффекты? Или если источник для этого метода изменится в будущем обновлении?).
На сегодняшний день лучшим подходом было бы заставить $.rails.confirm
вернуть обещание ... Но не похоже, что это произойдет в ближайшее время : (
Итак ... Я применил свой собственный метод, который, я думаю, стоит упомянуть, потому что он легче, чем метод, описанный выше. Он не угоняет allowAction
. Вот он:
# Nuke the default confirmation dialog. Always return true
# since we don't want it blocking our custom modal.
$.rails.confirm = (message) -> true
# Hook into any data-confirm elements and pop a custom modal
$(document).on 'confirm', '[data-confirm]', ->
if !$(this).data('confirmed')
myCustomModal 'Are you sure?', $(this).data('confirm'), =>
$(this).data('confirmed', true)
$(this).trigger('click.rails')
false
else
true
# myCustomModal is a function that takes (title, message, confirmCallback)
Какэто работает? Хорошо, если вы посмотрите на source , вы заметите, что метод allowAction
останавливается, если confirm event
возвращает ложное значение. Таким образом, поток:
- Пользователь нажимает на ссылку или кнопку с атрибутом
data-confirm
. На ссылке или кнопке отсутствует data-confirmed
, поэтому мы попадаем в первый блок if, запускаем наш пользовательский модальный режим и возвращаем false, тем самым останавливая действие изпродолжение в обработчике кликов ujs. - Пользователь подтверждает в пользовательском модале, и вызывается обратный вызов. Мы сохраняем состояние элемента через
data('confirmed', true)
и повторно инициируем то же событие, которое было инициировано ранее (click.rails
). - На этот раз
confirm event
попадет в блок else
(поскольку data('confirmed')
является правдивым) и вернет true, в результате чего блок allowAction
оценивается как true.
Я уверен, что даже пропалдругие способы, которые могут сделать это еще проще, но я думаю, что это действительно гибкий подход, чтобы получить пользовательский модал подтверждения без нарушения базовой jquery-ujs
функциональности.
(Кроме того, поскольку мы используем .on()
thisбудет связываться с любыми data-confirm
элементами на странице во время загрузки или в будущем, аналогично тому, как работает .delegate()
, если вам интересно.)