Не вызвано поведение Wicket 1.5 автозаполнения текстового поля при обновлении

#javascript #autocomplete #wicket #textfield

#javascript #автозаполнение #wicket #текстовое поле

Вопрос:

Мое AutoCompleteTextField (метод getChoices реализован и работает):

 AutoCompleteTextField<String> objectDescription = new AutoCompleteTextField<String>("objectDescription") { 
     getChoices() {...}
}
  

К этому текстовому полю я добавляю:

 objectDescription.add(new OnChangeAjaxBehavior()) {
     onUpdate() {....}
}
  

onUpdate Метод вызывается каждый раз, когда я что-то пишу в своем текстовом поле, но не тогда, когда я выбираю какой-либо элемент из меню автозаполнения. Строка из меню записывается в текстовое поле, но вызывает onUpdate только при внесении другого изменения.

Редактировать: До Wicket 1.5 это работало.

Ответ №1:

Добавьте AjaxFormComponentUpdatingBehavior("onchange") .

OnChangeAjaxbehavior() Кажется, что оно срабатывает при каждом изменении (использует Javascript Wicket.ChangeHandler ), как при каждом нажатии клавиши.

Использование AjaxFormComponentUpdatingBehavior добавит прослушиватель событий к onChange событиям javascript, например, при выделении текстового поля с другим значением или при выборе значения из списка автозаполнения.

Все еще не уверен, почему не OnChangeAjaxbehavior extends AjaxFormComponentUpdatingBehavior наследует эту логику от AjaxFormComponentUpdatingBehavior , должно быть что-то, что она переопределяет.

ОБНОВЛЕНИЕ Это вполне может быть причиной, по которой onchange события javascript игнорируются при использовании OnChangeAjaxBehavior . Исходный код для Wicket.ChangeHandler , найденный в wicket-ajax.js устанавливает обработчики для разных событий:

  • Создает резервную копию onchange обработчика событий в onchangeoriginal :
 obj.onchangeoriginal = obj.onchange  
  • Если браузер IE, Safari или какой-либо другой, он присваивает исходный onchange обработчик событий onKeyUp , onpaste и oncut .
  • Если нет, то для onchange присваивается исходный onInput обработчик события.
  • Наконец, он всегда удаляет onchange обработчик событий:

     obj.onchange = function(event){
        Wicket.stopEvent(event);
    }  

wicket-autocomplete.js Похоже, что код в onchange вручную запускает обработчик событий при выборе элемента. Вероятно, сначала следует проверить obj.onchangeoriginal .

Итак, поскольку этот js выполняется в OnDomReady , я сомневаюсь, что эти два поведения могут сосуществовать. Может быть, пришло время создать новый JIRA?

Это может быть немного связанной проблемой: WICKET-2424: OnChangeAjaxBehavior DatePicker не работают вместе

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

1. Спасибо, теперь это работает! Не знаю логики, стоящей за этим поведением, для меня это похоже на ошибку…

2. Я тоже обнаружил эту проблему … ее следовало исправить с помощью этого изменения: obj.onchangeoriginal = obj.onchange; но все еще работает не так, как ожидалось.

3. Да… Кажется, что они должны проверять obj.onchangeoriginal сначала в wicket-autocomplete.js .

4. Я отправил проблему по этому поводу: WICKET-4204 .

5. Я не знаю, связано ли это с этой проблемой, но AjaxIndicator -Image также не вызывается…