Прототип с несколькими автоматическими завершениями

#ajax #autocomplete #prototypejs

#ajax #автозаполнение #prototypejs

Вопрос:

Я пытаюсь создать интерфейс администратора, в котором можно выбирать модели разных типов, а затем сохранять их как новый объект.

 Event.observe($('modelSearch'),'focus',function(){
    new Ajax.Autocompleter( 'modelSearch', 'autoCompleteModel', 'xxx',
    {
        paramName: "q",
        indicator: "makeWaitPic",
        parameters: "previusId="   $( 'previusModelId' ).getValue(),
        afterUpdateElement: function( text, li )
            {
                if( li.id != '' )
                    $( 'modelId' ).value = <AjaxReturnValue>;
                else
                    $( 'modelSearch' ).value = '';
            }
    } );
});
  

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

проблема 1: Если я создам оба автозаполнения в dom: load, они будут считывать входное значение до того, как оно было установлено. И, следовательно, второе автозаполнение не будет работать.

проблема 2: Если я создам автозаполнение в observe: focus, они будут каждый раз считывать значение заново, но затем также будут создавать несколько экземпляров для себя каждый раз, когда фокусируется поле автозаполнения.

Могу ли я каким-либо образом заставить автозаполнение считывать вводимое значение заново каждый раз, когда я его использую, и инициализировать его только один раз? Или я могу каким-либо образом уничтожить объект, который содержит автозаполнение после того, как я его использовал, и в следующий раз создать новый?

Как я могу решить эту проблему, есть идеи?

Ответ №1:

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

 if( $( 'previousModelId' ).getValue() != prevId ){
    $('modelSearch').remove();
    $('wrapperId').insert({'top': '<input type="text" id="modelSearch" name="modelSearch" size="30" title="search model here." />'});
    initModelSearch();
    prevId = $( 'previousModelId' ).getValue();
}
  

Комментарии:

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