我想调用一个javascript函数,该函数将取决于用户对确认框的响应。
例如,我有以下锚:
<%= link_to 'Sign Out', destroy_session_path, confirm: 'Are you sure that you would like to sign out?', method: :delete %>
我应该放弃不引人注目的javascript并将我自己的jQuery回调绑定到我的锚点吗?
或者是否有一些神奇的方法将回调函数传递给Rails url帮助器?我没有在documentation中看到有关回调的讨论。
答案 0 :(得分:22)
通过关注link_to
来源,我看到:confirm
修饰符已传递给convert_options_to_data_attributes方法,该方法指向与Rails捆绑在一起的ujs script (通过jQuery不引人注目的javascript)。在这里,我们发现最终通过使用html中的confirm:complete
属性将用户的响应传递给名为data-confirm
的事件。
所以似乎答案是“不,你不能通过url helper传递回调”。但是你可以在你的app/javascript
中收听一个回调来监听这个事件。这似乎是实现我的目标最不显眼的方式,考虑到我仍然让rails处理事件预防和传播。我等待所有这一切发生,然后调用我的功能。
$(document).on('confirm:complete', function (e, answer) {
if (answer) {
// user confirmed!
myCallbackFunction();
} else {
// user canceled!
}
});
答案 1 :(得分:0)
我有类似的问题(How to use inline :confirm option for html helpers with AJAX calls?)。 @ Micah的答案,即使有效,也不是“Rails 3 way”的答案。
link_to 'Sign Out', destroy_session_path, remote: true, confirm: 'Are you sure that you would like to sign out?', method: :delete
在控制器中更改respond_to
块以回答js
使用与您的方法对应的名称创建一个js文件,例如: destroy_session.js.coffee
jQuery ->
$("form[data-remote]").on "ajax:success", (e, data, status, xhr) ->
$(e.currentTarget).closest('tr').fadeOut()`
希望有所帮助
答案 2 :(得分:0)
在2020年,被接受的答案对我不起作用。我最终做了这样的事情:
$(document).on('confirm:complete', function (e) {
if (e.originalEvent.detail[0]) {
// user confirmed!
myCallbackFunction();
} else {
// user canceled!
}
});