2015-07-10 99 views
0

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

@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事件到我的元素来强制组件自我刷新?

在此先感谢。

+0

通过查看“其他组件”的来源,我在这方面学到了很多东西。 PrimeFaces树是一个很好的例子,我认为它可以教你很多。也许BalusC有链接到一些教程,但在这里回答这个问题将取代很多(我的)时间,因为它不只是一些oneliner ... – Kukeltje

+0

感谢您的答案,我会研究它。当然,我不想让你写我的代码,我只是想知道如何完成它。我过去使用了类似的技术,并且可以直接添加一个事件,在该事件中我可以在后端触发一个方法,并且可以给它一个可以刷新的ID。 JSF中有类似的方法吗? –

+2

至于你试图解决的根本问题,OmniFaces有一个markupless树组件,它允许你完全自由地引入标记和事件。当然,它也是开源的http://showcase.omnifaces.org/components/tree。至于具体的问题,它有点过于宽泛和漫长,但我相信你正在具体寻找'ClientBehaviorHolder'。 – BalusC

回答

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的节点下并刷新树。这样我可以在需要子节点时构建我的结构。唯一的问题是每个节点下都有一个虚拟节点。我在展开父节点时删除了虚拟对象,但没有完全刷新,每个节点前面都有一个展开图标,无论实际上是否存在节点。但在我的情况下,这并不重要。

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

相关问题