Rails пользовательский Twitter Bootstrap модальный для метода удаления, проблема с обратным вызовом - PullRequest
2 голосов
/ 27 сентября 2011

Следующий код уничтожает записи по назначению, но обратный вызов наследуется от одного модального к следующему.Поэтому, пока запись удаляется должным образом, Rails продолжает искать и ранее удаленные записи.Я использую модальное окно Twitter Bootstrap, которое находится в шаблоне представления Rails и отображается при запуске стандартного метода удаления Rails, заменяя обычный диалог javascript.

Как очистить обратный вызов после того, как он былfired?

$.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');
    });
}

edit: Поскольку я использую один и тот же базовый модал снова и снова для любого действия удаления, обратные вызовы помещаются в очередь.Таким образом, если действие удаления было отменено ранее, оно все равно будет запущено на другом экземпляре удаления другого объекта, поскольку обратный вызов все еще действителен.Итог: как очистить очередь обратного вызова?

1 Ответ

2 голосов
/ 06 ноября 2011

Оказывается, это плохая идея возиться с собственным методом удаления / обратным вызовом по разным причинам.Мой обходной путь заключается в следующем:

В вашем представлении есть кнопка "удалить" с некоторыми значениями данных 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 - это еще один класс для меня, чтобы узнать, когда закрывать модальное окно начальной загрузки.Я добавил дополнительную функцию для этого в моем application.js .Обратите внимание, что по умолчанию путь имеет нулевое значение, мы добавим реальный идентификатор записи, который будет удален через JS, на следующем шаге с помощью параметра «data-id»:

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

Действие уничтожить в нашем контроллере сообщений будет использовать 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();

В целом это работает очень гладко!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...