У меня есть одна проблема с флажками в JSF.
Я хочу, чтобы они вели себя зависимо друг от друга, например, когда я отмечаю флажок, принадлежащий какому-либо объекту, у которого есть дочерние элементы, то должны быть также отмечены все флажки, которые принадлежат этим дочерним компонентам. А также, когда я снимаю галочку с одного из дочерних элементов, родитель тоже должен быть отключен. Это довольно просто с простым HTML / javascript, но я ничего не могу сделать с этим в JSF. По какой-то причине я не могу установить идентификаторы для них, потому что все флажки отображаются динамически в древовидной таблице, и это мешает мне устанавливать свои собственные идентификаторы, т.е. независимо от того, что я установил в свойстве идентификатора, будет применяться только постоянная часть, все передаваемые мной динамические данные игнорируются.
Я пытался сделать это через valueChangeListener или валидатор, но в обоих случаях после того, как я установил необходимые значения, что-то возвращает их назад! Я не знаю, кто это делает, и я ничего не могу с этим поделать. Вот некоторый код (я использую OpenFaces treeTable):
<o:treeTable id="instTreeTable" var="inst" ...>
<...>
<o:column id="isGranted" width="10%">
<f:facet name="header">
<h:outputText value="#{msg.access_granted}" />
</f:facet>
<h:selectBooleanCheckbox
value="#{inst.assignedToUser}"
styleClass="treeTableText"
valueChangeListener="#{MbUserInstitutions.onAccessGrantedChanged}"
>
<a4j:support event="onchange" reRender="instTreeTable"/>
</h:selectBooleanCheckbox>
</o:column>
<...>
</o:treeTable>
MbUserInstitutions:
public void onAccessGrantedChanged(ValueChangeEvent event) {
Boolean granted = (Boolean) event.getNewValue();
Institution inst = getInstitution();
if (granted.booleanValue() && inst.hasChildren()) {
setChildrenInsts(inst);
} else if (!granted.booleanValue() && inst.getParentId() != null){
unsetParentInst(inst);
}
}
private Institution getInstitution() {
return (Institution) Faces.var("inst");
}
private void setChildrenInsts(Institution parent) {
for (Institution child: parent.getChildren()) {
child.setAssignedToUser(true);
if (child.hasChildren()) {
setChildrenInsts(child);
}
}
}
private void unsetParentInst(Institution child) {
child.setAssignedToUser(false);
for (Institution inst: coreInsts) {
if (inst.getId().equals(child.getParentId())) {
unsetParentInst(inst);
break;
}
}
}