Вы добавляете AjaxEventBehavior к AjaxEditableMultiLineLabel, который НЕ ИСПРАВЛЯЕТ. AjaxEditableMultiLineLabel является панель, которая состоит из двух компонентов:
- этикетки
- Editor (текстовое поле)
Любое поведение Ajax должен быть добавить к любой из этих компонентов. В вашем случае вам нужно добавить поведение в редактор.
(после полного рабочего примера на https://repo.twinstone.org/projects/WISTF/repos/wicket-examples-6.x/browse)
Разметка
<h2>Form</h2>
<form wicket:id="form">
<div wicket:id="text"></div>
<input wicket:id="submit" type="submit" value="Send" />
</form>
<hr/>
<h2>Result</h2>
<div wicket:id="result">[result placeholder]</div>
фрагмент кода
final IModel<String> textModel = Model.of("initial text");
Form<String> form = new Form<>("form", textModel);
add(form);
AjaxEditableMultiLineLabel<String> textArea = new AjaxEditableMultiLineLabel<String>(
"text", textModel) {
private static final long serialVersionUID = 1L;
@Override
protected FormComponent<String> newEditor(MarkupContainer parent,
String componentId, IModel<String> model) {
final FormComponent<String> editor = super.newEditor(parent,
componentId, model);
editor.add(new AjaxFormComponentUpdatingBehavior("keyup") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
System.out.println("Ajax update for textArea " + editor.getDefaultModelObjectAsString());
}
});
return editor;
}
};
textArea.setCols(50);
textArea.setRows(20);
form.add(textArea);
form.add(new SubmitLink("submit"));
add(new Label("result", textModel));
ВНИМАНИЕ: ПРЕДЫДУЩИЙ КОД ДЕЙСТВИТЕЛЬНО ОЧЕНЬ МЕДЛЕННО
Код очень медленно, becuase каждое нажатие/отпускание делает следующее:
- вызова сервера с содержимым текстового поля
- Invoke код на стороне сервера (обновление, визуализацию и т.д.)
- Отправить назад весь результат тег как HTML в ответ XML (AJAX)
- Заменить весь результат тег
Это медленно на локальном хосте, в реальном Интернете, безусловно, не годны к употреблению.
РЕШЕНИЕ
Использование простого обновления JQuery (JavaScript, JQuery построен в калитке 6)
фрагмент кода с JQuery обновления
final IModel<String> textModel = Model.of("initial text");
final Label result = new Label("result", textModel);
result.setOutputMarkupId(true);
add(result);
Form<String> form = new Form<>("form", textModel);
add(form);
AjaxEditableMultiLineLabel<String> textArea = new AjaxEditableMultiLineLabel<String>(
"text", textModel) {
private static final long serialVersionUID = 1L;
private boolean initialized = false;
private FormComponent<String> editor;
@Override
public void onEdit(AjaxRequestTarget target) {
super.onEdit(target);
if(!initialized) {
String editorId = editor.getMarkupId();
String resultId = result.getMarkupId();
StringWriter sw = new StringWriter();
sw.write("$('#");
sw.write(editorId);
sw.write("').keyup(function() { var str = $('#");
sw.write(editorId);
sw.write("').val(); ");
sw.write("$('#");
sw.write(resultId);
sw.write("').html(str); });");
String js = sw.toString();
System.out.println("Appending editor JS " + js);
target.appendJavaScript(js);
initialized = true;
}
}
@Override
protected FormComponent<String> newEditor(MarkupContainer parent,
String componentId, IModel<String> model) {
editor = super.newEditor(parent, componentId, model);
return editor;
}
};
textArea.setCols(50);
textArea.setRows(20);
form.add(textArea);
form.add(new SubmitLink("submit"));
Спасибо, что посадили меня на правильный путь. К сожалению, я не могу использовать это точное решение, потому что калитка создает внутренний div, который не является «контентным», и он показывает обычный текст, поэтому мне нужно сделать некоторые уродливые взломы, а не ... – DPM
Ну, какова ваша цель? Является ли содержание div действительно ограниченным? Если вы хотите обновить свою модель при отправке формы, значит, AJAX может ее самостоятельно обновить и согласовать ваши данные, а также разместить тег textarea в вашей форме. Напишите комментарий, если вы знаете больше о решении. –
Проблема заключается в том, что AjaxEditableMultiLineLabel создается с блоком div внутри, который не является «контентным», и когда вы вставляете текст, он показывает простой текст, удаляя формат. Это очень важно для моего приложения. Я думаю, что я должен скопировать текст в скрытый div и использовать его для вызова ajax, но пока у меня нет рабочего решения. – DPM