Rails 3, начальная загрузка нескольких уровней удаленного вызова - PullRequest
0 голосов
/ 31 марта 2012

Я уже два дня ломаю голову от этого. Я очень расстроен, и я не могу найти какую-либо информацию по этому поводу при поиске.

Вопрос. Я использую ссылку: remote => true для загрузки HTML-кода с другого контроллера.

$('.managed_locations').bind('ajax:complete', function(evt, xhr, status){
    $('#locations_modal').modal('show')
    $('#locations_modal').html(xhr.responseText);
});

Таким образом, он получает html, сбрасывает его в модал начальной загрузки и отображает модал. Это работает нормально.

Но внутри модального я также есть форма, которая также использует: remote => true. Теперь, чтобы сделать жизнь сложнее, при нажатии кнопки я клонирую форму и отображаю ее. Таким образом, пользователь может иметь много форм.

Теперь вопрос. Когда форма отправляется, она просто загружается как обычная страница. Это как если бы: remote => true игнорируется. Но это только в модале. Если я просто загружаю модальный контроллер сам по себе, он работает просто отлично. Я также разработал это, прежде чем использовать другой лайтбокс jquery, где он работал нормально. Я просто включаю загрузчик для согласованности.

Итак, мои первоначальные мысли о том, что jquery_ujs.js не находит новые формы. Поэтому я добавил код для вывода элементов формы.

$("#log_events").click(function () {
$(document).find(".new_stored_physical_location").each(function() {
    console.log( $(this).data() );
    console.log( $(this).data('events') );
});
return false;
});

Какие выходы в консоли:

Object { type="html", remote=true}
Object { ajax:complete=[1]}

Итак, я вижу, что события устанавливаются в jQuery. Каждая из этих форм имеет: remote => true и имеет событие ajax для завершения запроса. Но я просто не выполняю ajax-запрос, когда я нажимаю на submit.

Есть ли что-то, чего мне не хватает, чтобы убедиться, что из формы будет выполняться запрос ajax ???? data () выглядит хорошо, данные ('events') выглядят нормально , Но есть ли какое-то другое событие / привязка, на которое мне нужно обратить внимание?

HTML, который загружается из модального режима прямо сейчас, загружает макет. Но я сделал это как с макетом, без макета. Это сводит меня с ума. Спасибо за помощь, ребята.

Редактировать: Некоторые дополнительные странности. Модал также загружает некоторые дополнительные удаленные ссылки, все из которых работают правильно. Похоже, что работают только ссылки на формы.

1 Ответ

1 голос
/ 01 апреля 2012

У меня есть решение.Большая проблема была в jquery_ujs.js Особенно эта строка:

$(document).delegate(rails.formSubmitSelector, 'submit.rails', function(e) {

К вашему сведению, rails.formSubmitSelector = 'form'.Таким образом, этот код нашел все формы в документе, перезаписал отправить с помощью этой функции.Но проблема заключалась в том, что, как только вы загрузили какой-то ajax, и этот ajax содержал a, он не добавил бы к этому причудливое событие.Вам нужно добавить его заново.

Так вот, что я и сделал.

Внутри jquery_ujs есть множество функций, которые доступны за ее пределами с помощью $ .rails.Такие вещи, как: $ .rails.enableElement, $ .rails.nonBlankInputs.И код для отправки события сидел без дела все невольно.Он выполняется только один раз, когда страница загружена.Поэтому я добавил это в функцию addSubmitEvent ():

// Add the form submit event
addSubmitEvent: function(element) {

  //$(element) was before $(document) but I changed it
  $(element).delegate(rails.formSubmitSelector, 'submit.rails', function(e) {


    var form = $(this),
      remote = form.data('remote') !== undefined,
      blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector),
      nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector);

    if (!rails.allowAction(form)) return rails.stopEverything(e);

    // skip other logic when required values are missing or file upload is present
    if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) {
      return rails.stopEverything(e);
    }

    if (remote) {
      if (nonBlankFileInputs) {
        return rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]);
      }

      // If browser does not support submit bubbling, then this live-binding will be called before direct
      // bindings. Therefore, we should directly call any direct bindings before remotely submitting form.
      if (!$.support.submitBubbles && $().jquery < '1.7' && rails.callFormSubmitBindings(form, e) === false) return rails.stopEverything(e);

      rails.handleRemote(form);
      return false;

    } else {
      // slight timeout so that the submit button gets properly serialized
      setTimeout(function(){ rails.disableFormElements(form); }, 13);
    }
  });

}

Это в основном тот же самый код.Но теперь это $ (элемент) вместо $ (документ).Это было изменено, потому что теперь я могу узнать, когда модал загружен в HTML.Затем я могу позвонить:

$.rails.addSubmitEvent('#my_modal');

У меня возникла проблема с добавлением события слишком много раз, когда я несколько раз открывал / закрывал модальное окно.Поэтому я просто поставил простой true / false, если вокруг него вызывать его только один раз.

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