12

我想调用一个以用户对确认框的响应为条件的 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 助手?我没有在文档中看到任何关于回调的讨论。

4

3 回答 3

24

通过跟踪link_to源代码,我看到:confirm修饰符被传递给convert_options_to_data_attributes方法,该方法指向现在与 Rails 捆绑的ujs 脚本(通过 jQuery 的不显眼的 javascript)。在这里我们发现最终用户的响应被传递给了一个confirm:complete使用data-confirmhtml 中的属性调用的事件。

所以看起来答案是“不,你不能通过 url helper 传递回调”。但是你可以在你的回调中app/javascript监听这个事件。考虑到我仍然让 Rails 处理事件预防和传播,这似乎是实现我的目标的最不显眼的方式。我等待所有这一切发生,然后调用我的函数。

$(document).on('confirm:complete', function (e, answer) {
  if (answer) {
    // user confirmed!
    myCallbackFunction();
  } else {
    // user canceled!
  }
});
于 2012-11-05T01:36:39.583 回答
1

我有一个类似的问题(How to use inline :confirm option for html helpers with AJAX calls?)。@Micah 的答案,即使有效,也不是“Rails 3 方式”。

  1. remote: true 选项需要添加到 link_to 助手中,例如

link_to 'Sign Out', destroy_session_path, remote: true, confirm: 'Are you sure that you would like to sign out?', method: :delete

  1. 在控制器更改respond_to块中回答 js

  2. 创建一个名称与您的方法对应的 js 文件,例如 destroy_session.js.coffee

app/views/competitions/destroy_session.js.coffee:

jQuery ->
  $("form[data-remote]").on "ajax:success", (e, data, status, xhr) ->
    $(e.currentTarget).closest('tr').fadeOut()`

希望有帮助

于 2013-04-18T20:12:10.290 回答
1

在 2020 年,接受的答案对我不起作用。我最终做了这样的事情:

$(document).on('confirm:complete', function (e) {
  if (e.originalEvent.detail[0]) {
    // user confirmed!
    myCallbackFunction();
  } else {
    // user canceled!
  }
});
于 2020-02-20T02:59:25.843 回答