【问题标题】:Rails link_to: Do something after confirmationRails link_to:确认后做某事
【发布时间】:2013-08-26 15:01:08
【问题描述】:

我正在尝试使用 link_to 通过 AJAX 执行保存操作:

<%= link_to 'Save', image_path(image), method: :patch, 
        data:{ confirm: 'Save image?', remote: true } %>

我希望在确认时将链接替换为&lt;span&gt;Saving...&lt;/span&gt;,但无法找到一种干净的方法。

现有解决方案的问题:

disable_with:
如果我添加:disable_with =&gt; '&lt;span&gt;Saving...&lt;/span&gt;',链接的内部 HTML 将被替换,而不是链接本身。不想这样。

点击:
如果我添加:onclick =&gt; "$(this).replaceWith('&lt;span&gt;Saving...&lt;/span&gt;');",即使用户取消确认,链接也会立即被替换

是否有适合 Rails 3 UJS 最佳实践的解决方案?

【问题讨论】:

    标签: javascript ruby-on-rails link-to


    【解决方案1】:

    你可以使用钩子ajax:beforeSend

    $('a#my_link_to').bind('ajax:beforeSend', function(evt, xhr, settings) {
      $(this).replaceWith('<span>Saving...</span>');
    })
    

    然后你可以添加一个绑定到ajax:success

    $('a#my_link_to')
      .bind('ajax:beforeSend', function(evt, xhr, settings) {
        $(this).replaceWith('<span id="saving">Saving...</span>');
      })
      .bind('ajax:success', function(evt, data, status, xhr) {
        $('span#saving').replaceWith('Saved!');
      })
    

    注意:请参考下面的评论,这也很重要

    【讨论】:

    • 请注意,成功处理程序永远不会被调用-因为您已替换 $(this) 绑定被破坏...
    【解决方案2】:

    我认为这是您想要的功能超出 Rails 的 JS 帮助程序提供的功能的情况。在这一点上,我将避免使用 :confirm 和 :remote 选项来链接_to,并以普通的 jQuery UJS 或类似的方式实现它。

    您可能还考虑隐藏链接并在用户确认时显示“正在保存...”范围,而不是替换 html;我认为这样最终会更简单,并且仍然会给你想要的效果。

    【讨论】:

      【解决方案3】:

      我认为你应该使用 confirm:complete 事件。 (详情:https://github.com/rails/jquery-ujs/blob/master/src/rails.js

      【讨论】:

      • @hedgesky- 这不起作用-confirm:complete 事件会触发确认是否被取消或确定。
      • 你是对的,在文档中他们说:“confirm:complete 事件被触发,无论用户对对话框的回答是真还是假”
      【解决方案4】:

      这就是我最终的做法:

      <%= link_to 'Save', image_path(image), method: :patch, 
              data:{ confirm: 'Save image?', remote: true }, 
              onclick: "$(this).one('ajax:beforeSend', 
                  function(e) { $(this).replaceWith('<span>Saving...</span>'); });" %>
      

      (这个解决方案的问题是,如果用户点击、不确认、再次点击等,处理程序会累积......因此并不理想......)

      【讨论】:

        【解决方案5】:

        您可以使用confirm:complete 事件。它获得了第二个布尔参数,用于判断结果是取消还是正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-25
          • 1970-01-01
          • 1970-01-01
          • 2020-10-27
          • 2020-07-17
          • 2016-05-18
          相关资源
          最近更新 更多