JSF2:重新呈现页面上具有给定ID的所有组件,没有绝对路径

时间:2010-12-26 17:08:18

标签: ajax jsf jsf-2

重新呈现所有组件的JSF 2.0 / PrimeFaces中是否有任何方法(使用PrimeFaces update="id1 id2..."属性或<f:ajax render="..."/>标记)给定ID ,无论它们是否包含触发AJAX重新渲染的按钮的相同形式?

例如,我希望我的按钮能够重新呈现页面上可视化用户当前购物篮的所有部分。

现在,我总是要指定我想要更新的组件的绝对路径,例如。

update=":header:basket :left-sidebar:menu:basket"

如果页面结构发生变化则相当不切实际(此外,我还无法找出其中一个组件的正确路径)。我已经尝试实现这样的自定义EL函数,它遍历组件树:

update="{utilBean.findAllComponentsMatchingId('basket')}"

但是在评估函数时,显然不是已经设置了整个组件树,因为它不包含我正在寻找的组件。

我该如何处理?肯定有一种简单的方法可以对页面中不属于当前<h:form>的部分进行基于AJAX的更新吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

因为(我认为)这是由UIComponent.findComponent(..)的工作方式决定的,所以我担心你运气不好。最接近的命名容器将作为搜索的基础。

无论如何,表格间的重新渲染不应该那么常见。命名容器结构不应经常改变。

答案 1 :(得分:0)

findAllComponentsMatchingId方法的定义是什么?这个btw看起来不像是自定义EL函数调用。另外“{}”根本不是EL表达式,但我认为这是一个错字。

问题可能在于您的findAllComponentsMatchingId的工作方式,而不是组件尚未在树中?查看此RendererUtils课程中的findComponentFor方法可能会有所帮助。

或者,您可以尝试将要更新的组件绑定到请求范围或视图范围映射。

E.g。在faces-context.xml中定义:

<managed-bean>
    <managed-bean-name>updates</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

然后将组件绑定到此:

<x:someComponent binding="#{updates['foo']}"

然后编写一个迭代此updates映射的EL函数,并返回所有组件客户端ID(component.getClientId(FacesContext.getCurrentInstance()))的空格分隔列表。