В Wicket есть 2 версии AutoCompleteTextField, одна в расширениях калитки, а другая в com.googlecode.wicket. Я пытаюсь использовать один из них в Wicket ModalWindow, но у меня возникают проблемы с обоими.
Обе версии обычно работают на веб-странице без использования модальных окон, но мне нужны они внутри одного. Существует несколько ограниченных примеров, но ничего особенного для модальных диалогов.
Версия расширения калитки:
Использование калитки 6.11.0
final AutoCompleteTextField<T> field = new AutoCompleteTextField<T>( "component", getSelectionModel(), theclass, new AutoCompleteSettings() ) {
private static final long serialVersionUID = 1L;
@Override
protected Iterator<T> getChoices( String input ) {
return AutoCompleteSelect.this.getChoices( input ).iterator();
}
};
field.setOutputMarkupPlaceholderTag( true );
field.add( new AjaxFormComponentUpdatingBehavior( "change" ) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate( AjaxRequestTarget target ) {
System.out.println( "Item selected! " + getSelectionModel().getObject() );
// This is never called!
}
} );
add( field );
Первоначально у меня были проблемы с тем, чтобы заставить это работать вообще, пока я не понял, что он не выбирает варианты, пока вы не нажмете клавишу «вниз». Если я помещу один в ModalWindow, его всплывающее окно испортится, и предложения появятся в правом нижнем углу экрана. Перемещение диалогового окна в правый нижний угол экрана усугубляет проблему.
Вопросы:
- Как сделать так, чтобы всплывающее окно появлялось при вводе текста в текстовое поле, а не при нажатии клавиши «вниз»?
- Как лучше всего получить вызов в стиле ajax onSelected (например, в версии Google?) В примерах калитки есть версия [1], который зависит от отправки формы, но это бесполезно, если вам это нужно до этого.
Версия Google:
Использование com.googlecode.wicket-jquery-ui версии 6.11.0
ITextRenderer<T> renderer = new ITextRenderer<T>() {
private static final long serialVersionUID = 1L;
@Override
public String getText( T object ) {
return object == null ? "" : object.toString();
}
@Override
public String getText( T object, String expression ) {
return object == null ? "" : expression + "." + object.toString();
}
};
final AutoCompleteTextField<T> field = new AutoCompleteTextField<T>( "component", getSelectionModel(), renderer, m_class ) {
private static final long serialVersionUID = 1L;
protected void onSelected( AjaxRequestTarget target ) {
System.out.println( "Item " + getSelectionModel().getObject() + " has been selected" );
}
@Override
protected List<T> getChoices( String input ) {
return AutoCompleteSelect.this.getChoices( input );
}
};
Хотя изначально это работает лучше (onSelected полезен, и всплывающее окно появляется в правильном месте), размещение его в модальном диалоговом окне приводит к тому, что всплывающее окно появляется под диалоговым окном. Это можно исправить, изменив z-индекс с помощью CSS (немного запутанно, но работает), но, похоже, есть событие, которое скрывает всплывающее окно всякий раз, когда вы наводите на него курсор, что означает, что ничего нельзя выбрать.
- Кому-нибудь удалось остановить исчезновение всплывающего окна?
- Есть ли лучший способ справиться с проблемой z-index?
Примеры расширения калитки: http://www.wicket-library.com/wicket-examples/ajax/autocomplete?0 Примеры Google: http://www.7thweb.net/wicket-jquery-ui/autocomplete/ConverterAutoCompletePage?0
Заранее спасибо.