我在JSF中遇到了一个问题。 我希望它们相互依赖,例如,当我检查属于某个具有子项的对象的框时,必须检查属于这些子组件的所有复选框。而且当我取消选中一个孩子的复选框时,父母也应该被取消选中。使用简单的HTML / javascript非常简单,但在JSF下我无法做任何事情。出于某种原因,我无法为它们设置ID,因为所有复选框都是以treetable动态呈现的,它阻止我设置自己的ID,即无论我在ID属性中设置什么,只有常量部分才会应用,我传递的所有动态数据都是忽略。 我试图通过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;
}
}
}