customComponent

时间:2015-07-10 07:47:45

标签: ajax jsf jsf-2.2 custom-component

我目前正在深入研究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) {
    }

}

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

经过一番来回,我能够解决我的问题。 我推迟了“完全自己动手”课程并使用了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中的节点下并刷新树。这样我可以在需要子节点时构建我的结构。唯一的问题是每个节点下的诅咒都有一个虚拟节点。我在扩展父节点时删除了虚拟对象,但没有完全刷新,每个节点前面都有一个展开图标,无论其下是否有实际节点。但就我而言,这并不重要。

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