Прототип Ajax.Autocompleter в динамически добавляемом HTML не работает - PullRequest
2 голосов
/ 26 октября 2010

Привет, это первый раз, когда я фактически закончил писать вопрос, не давая мне ответа в процессе.:)

У меня есть вложенная форма (в соответствии с руководством Ryan Bates по Railscast по теме), которая позволяет пользователям динамически добавлять дополнительные поля для добавления / удаления вложенных моделей с использованием JavaScript на основе Prototype.Дополнительные поля могут быть добавлены и удалены и отлично работают для создания новых моделей.

Проблема в том, что в одном из полей используется Ajax.Autocompleter;код на странице, когда визуализируется частичное, выглядит следующим образом:

<script type="text/javascript">
//<![CDATA[
new Ajax.Autocompleter(...various args...);
//]]>
</script>

Автозаполнение работает нормально, если частичное рендеринг начинается с (например, если форма начинается с одного экземпляра частичного,или при редактировании существующих вложенных моделей).Однако, это не работает в динамически добавляемых полях формы.

Я попытался использовать и insert (), и просто установить innerHTML пустого div для вставки частичного HTML.С помощью insert () выполняется оценка кода автозаполнения, и все в теге <script> исчезает (как я понимаю, ожидается), но автозаполнение не работает.При настройке innerHTML скрипт выглядит точно так же, как и в предварительно отрендеренном фрагменте, но автозаполнение все равно не вызывается.

Я подозреваю, что это как-то связано с тем, как работает evalScripts, и я нашел некоторую документацию по теме , но мне трудно разобраться, как подать заявкуэто к объявлению Автозаполнения.

Любой совет, который высоко ценится!

ETA : добавление javascript, используемого для добавления в новый раздел:

  function add_section(link, nested_model_name, content) {
      // get the right new_id which should be in a div with class "last_id" at the bottom of 
      // the nearest section
      var last_id = parseInt($(link).up().previous('.last_id').innerHTML);
      var new_id = last_id + 1;
      var regexp = new RegExp("new_" + nested_model_name, "g");
      content = content.replace(regexp, new_id)

      // this is the line that actually inserts the content into the page
      $(link).up().insert({before: content});
  }

Отладка с помощью firebug показывает, чтосодержимое корректно (т.е. содержит нормально работающий код автозаполнения) перед его вставкой.

Ответы [ 3 ]

1 голос
/ 02 июня 2011

Я знаю, что это старый вопрос, но у меня недавно была такая же проблема.

Я не уверен, какую версию auto_complete вы используете? Я использовал rails / auto_autocomplete из git.

В этом плагине код javascript был таким

lib/auto_complete_macros_helper.rb

def auto_complete_field(field_id, options = {})
    function =  "var #{field_id}_auto_completer = new Ajax.Autocompleter("

У меня была такая же проблема. Поля ввода будут видны, но функция автозаполнения не будет работать. Оказалось, что ключевое слово var делает видимую локальную область видимости.

Это означало, что все, что оценивалось в evalscripts, находилось в другой области видимости, чем исходный объект DOM.

Мой патч состоял в том, чтобы просто удалить ключевое слово var.

lib/auto_complete_macros_helper.rb

def auto_complete_field(field_id, options = {})
    function =  "#{field_id}_auto_completer = new Ajax.Autocompleter("

Я недостаточно знаю о вашей настройке, чтобы сказать наверняка, что не так, но держу пари, что это как-то связано с объемом evalscripts.

0 голосов
/ 26 октября 2010

Хорошо, поэтому в качестве эксперимента я попытался просто изменить свой вспомогательный код автозаполнения следующим образом, и теперь он работает нормально:

ОТ:

javascript_tag("new Ajax.Autocompleter(...

TO:

javascript_tag("var autocomplete_for_#{fieldname} = new Ajax.Autocompleter(...

Это в хелпере Rails, но если я не пойму неправильно, я думаю, что смысл в том, что, объявив переменную, он заставляет прототип фактически оценивать новый вызов при вставке кода.

(Любойхотя лучше и лучше понять, почему это работает, а что-то другое - не приветствуется, поскольку сейчас это в основном слепая удача.)

0 голосов
/ 26 октября 2010

Ваш JS регистрирует автозаполнение в теге скрипта, который вы загружаете через ajax.updater?если это так, вам нужно добавить параметр evalScript, чтобы он был оценен: new Ajax.Updater('target',url,{method:'get', evalScripts:true});

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