#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. Я использовал ту же идею, но вместо удаления элемента ввода я просто снова вызываю ту же функцию, и она работает просто отлично, т. е. объект создается заново с новым обновленным значением, переданным в аргументе.