Богатое дерево JSF + AJAX

У меня богатое дерево, и оно содержит несколько узлов. У меня есть флажок рядом с каждым узлом. Когда я устанавливаю флажок, необходимо установить флажок, относящийся ко всем дочерним элементам, а когда я снимаю флажок, все дочерние элементы должны быть сняты. У меня есть приведенный ниже код в моем файле xhtml. В поддерживающем bean-компоненте я установил для всех дочерних элементов значение Checked/Unchecked в зависимости от события. Дерево изначально находится в "свернутом" режиме. Когда я нажимаю на флажок и разворачиваю узел, я вижу, что все дочерние элементы проверяются. Но когда я снимаю/проверяю в расширенном режиме, значения не отражаются в дочерних элементах. Не могли бы вы помочь мне узнать, что мне не хватает? Спасибо.

    <rich:tree id="producttree" switchType="server"
        value="#updateProductBean.deviceServiceTreeRoot}" var="item">
        <rich:treeNode id="productnode">
            <h:selectBooleanCheckbox value="#{item.selected}"
                rendered="#{item.value == null &amp;&amp; item.checkbox == true}"
                valueChangeListener="#{updateProductBean.submitUpdateProduct}">
                <f:attribute name="selectedProductId" id="selectedProductId"
                    value="#{item.paramID}" />
                <f:attribute name="selectedProductName" id="selectedProductName"
                    value="#{item.name}" />
                <a4j:support event="onclick" reRender="producttree,productnode">
                </a4j:support>
            </h:selectBooleanCheckbox>
            <h:outputText value="#{item.name}" rendered="#{item.value == null}" />
        </rich:treeNode>
    </rich:tree>

person Punter Vicky    schedule 03.07.2012    source источник
comment
Я предполагаю, что это проблема повторного рендеринга. Вы уверены, что дерево перестраивается после установки флажка?   -  person Ellie Fabrero    schedule 10.07.2012
comment
Элли, спасибо за ответ. Я не уверен, полностью ли перестраивается дерево. Я добавил логическую переменную, относящуюся к выбранному свойству флажка, в качестве выходного текста. Это значение изменяется для флажка, который я проверяю, но не уверен, что элементы chold перерисовываются.   -  person Punter Vicky    schedule 10.07.2012


Ответы (2)


Попробуйте обернуть h:selectBooleanCheckBox внутри тега a4j:outputPanel, затем определить имя идентификатора, а затем повторно визуализировать этот a4j:outputPanel в теге a4j:support. Если он все еще не перерендерен, попробуйте поставить ajaxRendered="true" на свой a4j:outputPanel, это сделает его всегда обновленным для каждого запроса ajax.

Попробуй это.

<rich:tree id="producttree" switchType="server"
                value="#updateProductBean.deviceServiceTreeRoot}" var="item">
                <rich:treeNode id="productnode">
                    <a4j:outputPanel id="panel" ajaxRendered="true">
                        <h:selectBooleanCheckbox value="#{item.selected}"
                            rendered="#{item.value == null &amp;&amp; item.checkbox == true}"
                            valueChangeListener="#{updateProductBean.submitUpdateProduct}">
                            <f:attribute name="selectedProductId" id="selectedProductId"
                                value="#{item.paramID}" />
                            <f:attribute name="selectedProductName" id="selectedProductName"
                                value="#{item.name}" />
                            <a4j:support event="onclick"
                                reRender="producttree,productnode, panel">
                            </a4j:support>
                        </h:selectBooleanCheckbox>
                    </a4j:outputPanel>
                    <h:outputText value="#{item.name}"
                        rendered="#{item.value == null}" />
                </rich:treeNode>
            </rich:tree>
person Ellie Fabrero    schedule 11.07.2012
comment
Привет, Элли, попробовал это, но это также не обновляет флажки, относящиеся к дочерним элементам :( - person Punter Vicky; 18.07.2012
comment
попробуйте проверить, обновлены ли значения флажка внутри ваших узлов и правильно ли перестроено дерево. Так как он работает в режиме коллапса. - person Ellie Fabrero; 19.07.2012
comment
Я попытался напечатать значения флажков внутри поддерживающего компонента в методе (submitUpdateProduct), который вызывается при проверке/снятии отметки. Я явно устанавливаю значения всех дочерних элементов в true или false в зависимости от того, установлен ли родительский флажок или нет. Значения установлены правильно. Как я могу убедиться, что дерево перестроено правильно? Спасибо за вашу помощь. - person Punter Vicky; 19.07.2012
comment
можете ли вы использовать change switchType=ajax, поскольку вы используете a4j:support, это означает, что он срабатывает по запросу ajax. Я попытаюсь создать свой собственный пример на основе вашего кода и посмотреть, работает ли он на моем. - person Ellie Fabrero; 20.07.2012
comment
Привет, Элли, проблема была исправлена, когда я установил для дерева значение null в вспомогательном компоненте. После этого дерево отрендерилось должным образом. Большое спасибо за вашу помощь!! Кстати - дал вам награду :) - person Punter Vicky; 24.07.2012

Он отображает весь один уровень, на который вы нажимаете на дерево, поэтому, если у вас есть какой-либо вызов ajax, он вызовет самый первый узел и пропустит отдых. Вся история отображает весь уровень.

person Bhup    schedule 22.11.2013
comment
Вы можете перефразировать свой ответ для ясности и привести пример, иллюстрирующий вашу точку зрения. - person Glenn Teitelbaum; 22.11.2013