В моем приложении у меня есть listView с примерно 100 строками. Каждая строка содержит textField с поведением. Проблема в том, что эта страница занимает слишком много времени около 2 секунд. Когда я удаляю это поведение, он занимает всего пару мс. Мой вопрос в том, почему это так долго, и есть ли способ сделать это быстрее?
add(new ListView<PlayOffGame>("games") {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final ListItem<Game> listItem) {
listItem.add(new TextField<String>("results").add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
// do something
}
}));
}
});
ОБНОВИТЬ
калитка версия: 1.5.9
render = метод onRender:
@Override
protected void onRender() {
logger.debug("Render start");
long time = System.currentTimeMillis();
super.onRender();
time = System.currentTimeMillis() - time;
logger.debug("Render: " + time + " ms");
};
Это займет много времени, потому что для каждого TextField
вы добавляете строку javascript (с помощью AjaxFormComponentUpdatingBehavior
).
У меня были некоторые проблемы с AjaxEventBehavior
. Я внедрил пользовательское поведение родителя, которое проверяет, какой из них вызвал событие. Это значительно сокращает время рендеринга, а также время загрузки браузера.
Я думаю, что можно было бы сделать что-то подобное для AjaxFormComponentUpdatingBehavior
, переопределив onEvent
и получив правильный child- FormComponent
. Для FormComponent
потребуется setOutputMarkupId(true)
и вам потребуется некоторый javascript cutsom, чтобы передать id
в поведение.