Было бы полезно, если бы вы включили в код, как вы строите эти текстовые области, и если вы добавляете их обратно в AjaxRequestTarget
.
В любом случае, я вижу, что вы пытаетесь реализовать поведение на стороне сервера, чтобы сделать что-то, что вы могли бы сделать на стороне клиента (на самом деле, это операция на стороне клиента). Вы бы лучше сняли все остальные флажки на стороне клиента, например, с помощью javascript.
Вы можете заставить Component
реализовать IHeaderContributor
и вывести атрибуты HTML id
флажков в Javascript. Тогда каждый флажок может иметь обработчик событий onchange
, в котором вы можете снять все остальные флажки, выбирая их с помощью document.getElementById()
.
При таком подходе вам не понадобится setReuseItems(true)
. Если вы напишите ListView
обратно в AjaxRequestTarget
, setReuseItems()
поможет вам сохранить те же Components
, которые были созданы при первом выполнении populateItem()
(то есть, они сохранят тот же идентификатор markupId). В общем, если вам нужно управлять состоянием компонентов внутри ListView
, рекомендуется использовать setReuseItems(true)
. В этом случае это делается на стороне клиента, поэтому на первый взгляд в этом нет необходимости.
Например:
private class InputForm extends Form implements IHeaderContributor {
private List<String> checkboxIds = new ArrayList();
//...
protected void populateItem(ListItem<NameWrapper> item) {
// PropertyModel can be used on Models, too,
// not necessarily modelObejcts.
IModel checkboxModel = new PropertyModel<Boolean>(item.getModel(), "selected"));
final CheckBox checkBox = new CheckBox("check", checkboxModel);
checkBox.setOutputMarkupId(true);
// If checkboxMarkupId is null at this point,
// you can always set it this way
// checkBox.setMarkupId("check" + item.getIndex());
String checkboxMarkupId = checkBox.getMarkupId();
checkboxIds.add(checkboxMarkupId);
item.add(checkBox);
String js = "deselectChecks('" + checkboxMarkupId + "');";
checkbox.add(new SimpleAttributeModifier("onchange", js));
}
//...
public void renderHead(IHeaderResponse response) {
String jsArrDecl = "var checkIds = [";
for (String checkId : checkboxIds){
jsArrDecl += "'" + checkId + "', ";
}
jsArrDecl = jsArrDecl.substring(0, jsArrDecl.length()-1);
jsArrDecl += "];";
response.renderOnDomReadyJavascript(jsArrDecl);
}
}
Javascript:
function deselectChecks(selected){
for each (var checkId in checkIds) {
if (checkId != selected){
document.getElementById(checkId).checked = false;
}
}
}
Вы можете добавить onchange="deselectChecks(this.id);"
к флажкам в файле HTML или добавить его с помощью SimpleAttributeModifier
в классе Java.
Как всегда, вы должны также реализовать это ограничение / поведение на стороне сервера, чтобы пользователи без JavaScript не могли его обойти. Я бы предложил FormValidator
на этот счет.