RichFaces rich: дерево nodeSelectListener не прослушивается - PullRequest
1 голос
/ 24 февраля 2010

У меня есть rich:tree компонент, используемый так:

                    <rich:tree switchType="client" value="#{MyBacking.logTree}"
                    reRender="selectedLog" var="item" nodeFace="#{item.type}"
                    nodeSelectListener="#{MyBacking.processLogSelection}"
                    style="width: 50px;">
                    <rich:treeNode type="folder"
                        icon="/img/logListFolderIconClosed.png"
                        iconLeaf="/img/logListFolderIconOpen.png">
                        <h:outputText value="#{item.name}" />
                    </rich:treeNode>
                    <rich:treeNode type="log" iconLeaf="/img/logFileIcon.png"
                        icon="/img/logFileIcon.png">
                        <h:outputText value="#{item.name}" />
                    </rich:treeNode>
                </rich:tree>

и мой метод processBogSelection () в MyBacking:

    public void processLogSelection(NodeSelectedEvent event) {
    logger.info("In processLogSelection");
    HtmlTree tree = (HtmlTree) event.getComponent();
    nodeTitle = (String) tree.getRowData();
    selectedNodeChildren.clear();
    TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
    if (currentNode.isLeaf()){
        selectedNodeChildren.add((String)currentNode.getData());
    } else {
        Iterator<Map.Entry<Object, TreeNode>> it = currentNode.getChildren();
        while (it != null && it.hasNext()) {
            Map.Entry<Object, TreeNode> entry = it.next();
            selectedNodeChildren.add(entry.getValue().getData().toString()); 
            logger.info("selected node: " + entry.getValue().getData().toString());
        }
    }
}

Но когда страница отображает дерево (точный), щелчок по узлу выделяет узел, но ничего не регистрируется ни одним из вызовов средства ведения журнала bean - метод просто не вызывается. Любая помощь, ответившая, почему это может быть, будет принята с благодарностью. Mark

РЕДАКТИРОВАТЬ Добавлены предлагаемые теги / упрощенный метод bean-компонента - по-прежнему не получается получить ответ от bean-компонента в отношении журналов:

            <h:panelGrid columns="2" border="0" width="100%" rowClasses="tt">
            <rich:panel styleClass="panelLogTree" header="Log Select">
                <h:form>
                    <rich:tree switchType="client" value="#{MyBacking.logTree}"
                        var="item" nodeFace="#{item.type}" reRender="selectedLog"
                        nodeSelectListener="#{MyBacking.processLogSelection}"
                        ajaxSubmitSelection="true" style="width: 50px;">
                        <rich:treeNode type="folder"
                            icon="/img/logListFolderIconClosed.png"
                            iconLeaf="/img/logListFolderIconOpen.png">
                            <h:outputText value="#{item.name}" />
                        </rich:treeNode>
                        <rich:treeNode type="log" iconLeaf="/img/logFileIcon.png"
                            icon="/img/logFileIcon.png">
                            <h:outputText value="#{item.name}" />
                        </rich:treeNode>
                    </rich:tree>
                </h:form>
            </rich:panel>

            <rich:panel styleClass="panelLogOutput" header="Log Content">
                <h:outputText escape="false"
                    value="Log content: #{MyBacking.nodeTitle}" id="selectedLog" />
            </rich:panel>
        </h:panelGrid>
    </rich:tab>

Обратите внимание на конец rich:tab, поскольку это дерево отображается на вкладке из включенного файла JSP. Мой метод поддержки бина также теперь:

    public void processLogSelection(NodeSelectedEvent event) {
    logger.info("In processLogSelection");
}

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ Интересно, что я решил вернуться к базовой рабочей модели. Я взял код со страницы демонстрации RichFaces . Я изменил face-config.xml, добавив бин SimpleTreeData. У меня были проблемы с получением кода компонента, который читает файл данных в (simple-tree-data.properties), поэтому вместо него я использовал FileReader. Это нормально, и я получил измененную jsf-страницу index.jsp, чтобы перечислить простой пример дерева, как на демонстрационной странице, за исключением того, что нажатие на элемент списка не сообщило о выбранном nodeTitle в указанное место (та же проблема).

Я могу видеть это либо как ту же проблему, о которой сообщалось выше, либо как факт изменения метода loadTree в компоненте SimpleTreeData.java. В этом изменении я удалил следующие строки и изменил посторонний код соответствующим образом:

        FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    InputStream dataStream = externalContext.getResourceAsStream(DATA_PATH);

Как упоминалось ранее, я использовал FileReader, но кто-нибудь думает, что эта проблема может быть связана с удалением этих 3 строк? Как также указано выше, мой метод processLogSelection не использует getCurrentInstance, но я не уверен, что это необходимо, если в JSF указан ajaxSubmitSelection="true".

Тупик.

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Я попробовал этот шаблон Facelets и этот образец Java-компонента поддержки , и метод был вызван.Я предполагал, что вы используете Seam, но, возможно, я ошибаюсь :) Некоторое время назад были некоторые жалобы: форум шва .Какую версию Richfaces вы используете и какой браузер?Если вы используете также Seam, пожалуйста, сообщите его версию.

0 голосов
/ 03 марта 2010

Исправление для этого состояло в том, чтобы установить банку с лицевой стороной. Смотрите здесь . Неудивительно, что это затронуло и другие мои проблемы.

...