微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你能从p:ajax监听器更新h:outputLabel吗?

我正在尝试使用p:ajax标签,然后在该监听器中,我设置了一个名为“periodRendered”的值.然后我试图通过p:ajax标签的更新来更新h:outputLabel标签.它没有更新ajaxily,我在想它是因为一个primefaces ajax标签无法更新标准的jsf outputLabel标签.

我的假设是否正确,是否有更合适的标签我应该使用而不是h:outputLabel?

<h:outputLabel for="addProgramTo" value="Add Program To" />
<p:selectOneMenu value="#{ppBacker.grantProgram.grant_project_id}" id="addProgramTo" size="1" styleClass="listBoxMedium">
    <p:ajax process=":addProgram:addProgramTo" update=":addProgram:periodGrid,:addProgram:periodLabel" event="change" listener="#{ppBacker.addProgramListener}" />
    <f:selectItems value="#{ppBacker.grantProjectDropDownList}" />
</p:selectOneMenu>            

<h:outputLabel for="period" value="Period" id="periodLabel" rendered="#{ppBacker.periodRendered}">

解决方法

您无法更新未呈现的元素,render = false“是JSF方式”以从DOM树中删除元素,

它不像css display:none或visibility:hidden< - 这两个将保留DOM树中的元素但隐藏,而JSF呈现= false甚至不会渲染(保留)DOM树中的元素(你甚至看不到它在页面的“查看源”中) 所以在你的情况下你需要用`panelGroup’包装outputLabel并更新包装器的id

<h:panelGroup id="periodLabelWrapper">
    <h:outputLabel for="period" value="Period" id="periodLabel" rendered="#{ppBacker.periodRendered}">
</h:panelGroup>

并在< p:ajax update属性中引用包装器(总是在DOM树中)id,如下所示:

<p:ajax process=":addProgram:addProgramTo" update=":addProgram:periodGrid,:addProgram:periodLabelWrapper" event="change" listener="#{ppBacker.addProgramListener}" />

另一种解决方案是更新整个表单,如下所示< p:ajax update =“@ form”...这样你不需要包装outputLabel 关于你的评论问题

how does @form update the un-rendered elements,but targeting them directly through id’s does not?

您无法在更新中定位页面中不存在的元素(rendered = false)“它不在那里”

但是当你使用update =“@ form”或update =“someWrapperID”时,表单/包装器“重新计算”它的所有内部元素,包括render =“#{someBean.someCondition}”并且条件得到“重新评估” “所以,如果结果是真的,那么将展示elemet ……

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐