2

以下代码确实按预期销毁记录,但回调是从一个模式继承到下一个模式。因此,当一条记录被正确删除时,Rails 也一直在寻找删除以前删除的记录。我正在使用 Twitter Bootstrap 模式窗口,它位于 Rails 视图模板中,并在触发标准 Rails 删除方法时显示,替换了常规的 javascript 对话框。

触发后如何清除回调?

$.rails.allowAction = function(element) {

  var message = element.data('confirm'),
  answer = false, callback;
  if (!message) { return true; }

  if ($.rails.fire(element, 'confirm')) {
    myCustomConfirmBox(message, function() {
     callback = $.rails.fire(element,
       'confirm:complete', [answer]);
     if(callback) {
       var oldAllowAction = $.rails.allowAction;
       $.rails.allowAction = function() { return true; };
       element.trigger('click');
       $.rails.allowAction = oldAllowAction;
     }
    });
  }
  return false;
}

function myCustomConfirmBox(message, callback) {
    $('#dialog-confirm').modal('show');
    $('#dialog-confirm button.primary').click(function(){
        callback();
        $('#dialog-confirm').modal('hide');
    });
}

编辑:由于我对任何删除操作一遍又一遍地使用相同的基本模式,因此回调排队。所以当一个删除动作之前被取消时,它仍然会在另一个对象的另一个删除实例上被触发,因为回调仍然有效。底线:如何清除回调队列?

4

1 回答 1

2

事实证明,出于各种原因摆弄本机删除方法/回调是一个坏主意。我的解决方法如下。

在您的视图中有一个“删除”按钮,其中包含一些 JS 数据值:

#delete button in view template
link_to "delete", "#", 
   :class => "delete_post", 
   "data-id" => YOUR_POST_ID, 
   "data-controls-modal" => "YOUR_MODAL_LAYER",
       #more bootstrap options here…

Bootstrap 打开模态窗口。在里面,有另一个“删除”按钮,设置了“远程”,所以动作将使用 JS。

#delete button in modal window
link_to "delete", post_path(0), 
   :method => :delete, 
   :class => "btn primary closeModal", 
   :remote => true  

CloseModal是另一个 :class 让我知道何时关闭引导模式窗口。我在application.js中为此添加了一个附加功能。注意,默认路径的值为 nil,我们将在下一步中通过“data-id”参数附加要通过 JS 删除的真实帖子 ID:

#application.js 
$('a.delete_post').live('click', function(){
    _target = $(this).data('id');
    $('#YOUR_MODAL_LAYER .primary').attr('href', '/posts/' + _target);
});

我们的 Posts 控制器中的 destroy 动作将使用 JS 为已删除的帖子呈现动画:

#posts_controller.rb
def destroy
    @post = Post.find(params[:id])
    @post.destroy
    respond_to do |format|
       # format.html { redirect_to(posts_url) }
       format.js { render :content_type => 'text/javascript' }
    end
end

请随意插入此处的效果。在此示例中,我们只是淡出已删除的帖子:

#views/posts/destroy.js    
$("div#post-<%= params[:id] %>").fadeOut();

总而言之,这真的很顺利!

于 2011-11-06T12:23:38.307 回答