customComponent 中元素的 onClick 事件

onClick Event on Element in customComponent

我目前正在深入研究 JSF,我有一个问题。 我在一个小型应用程序中使用 JSF 2.2 (Mojarra 2.2.9)。我已经构建了一个自定义组件来将数据结构呈现为菜单。代码看起来像这样:

@FacesComponent(createTag = true, tagName = "UIRecursiveTree", namespace = "")
public class UIRecursiveTree extends UIComponentBase {

    @Override
    public String getFamily() {
        return "";
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {

    }

    private void writeFolderStructure(Map<IContainer, ?> map, ResponseWriter writer, String prefix) {
    }

}

我已经删除了一些代码,当然我已经设置了系列和命名空间,只是隐藏了它。该控件具有一个值属性,该属性接收在我的应用程序中呈现的 LinkedHashMap。 一切正常。目前我只是用代表我的结构的 ResponseWriter 打印一些标签。问题是,结构可能非常大,加载结构的机制并不理想,至少如果我一次加载所有内容,这需要很长时间。 所以,我的想法是,我想将我的元素(目前只是标签,但会被链接或类似的东西替换)绑定到 onClick 事件,这会触发组件再次加载新值 (Ajax) (获取当前元素的子元素并将它们添加到我的结构中,以便仅在需要时加载值)

我知道在一些库中可能有一些控件可以用来映射这样的结构,但我正在学习 JSF 并且使用已经完成的东西没有教我任何东西。 =)

所以,问题是,如何将 onClick 事件绑定到我的元素以强制组件自行刷新?

提前致谢。

经过一番折腾,终于解决了我的问题。 我推迟了 "do it completely yourself" 课程并使用了 PrimeFaces 的树控件。

<p:tree id="treeMap" value="#{treeView.root}" var="container" dynamic="true" selectionMode="single" selection="#{treeView.selectedNode}">
    <p:ajax event="expand" update="treeMap" listener="#{treeView.onNodeExpand}" />
    <p:ajax event="select" update=":form" listener="#{treeView.onNodeSelect}" />

    <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed">
        <h:outputText value="#{container.getName()}" />
    </p:treeNode>
    <p:treeNode type="dummy" icon="ui-icon-video" rendered="false" styleClass="hidden" />

</p:tree>

<h:commandButton value="Reset Tree" action="#{treeView.reset()}" />

我使用那些 actionListeners 来构建我的树。

最初我只获取项目的第一级,即根。当我展开节点时,其他所有内容都会加载。为了能够扩展节点(我需要在根节点下有一个子节点),我在每个节点下添加了一个虚拟节点。当我单击展开符号时,我会触发 onExpand 侦听器。此方法调用我的服务,该服务获取当前节点的子节点并将它们放在我的 bean 中的节点下并刷新树。这样我就可以在需要子节点时构建我的结构。唯一的问题是每个节点下的诅咒都有一个虚拟节点。当我展开父节点时,我删除了虚拟对象,但是如果没有完全刷新,每个节点前面都会有一个展开图标,不管它下面是否真的有一个节点。但就我而言,这并不重要。

我希望我能帮助正在寻找类似解决方案的人。