2

次のコードは意図したとおりにレコードを破棄しますが、コールバックはあるモーダルから次のモーダルに継承されます。そのため、レコードが適切に削除されている間、Rails は以前に削除されたレコードも削除しようとします。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 に答える