установить / снять флажки в JSF - PullRequest
1 голос
/ 27 мая 2010

У меня есть одна проблема с флажками в 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;
            }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...