Cat*_*ish 5 ajax jsf primefaces jsf-2
我正在尝试使用ap: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}">
Run Code Online (Sandbox Code Playgroud)
Dan*_*iel 10
你无法更新未呈现的元素,rendered=false"是一种JSF方式"来从DOM树中删除元素,
它不像css display:none或visibility:hidden < - 这两个将元素保留在DOM树中但隐藏,而JSF rendered=false甚至不会渲染(保留)DOM树中的元素(你甚至不会在页面的"视图源"中看到它)
所以在你的情况下你需要outputLabel用`panelGroup'包装并更新包装器的id
<h:panelGroup id="periodLabelWrapper">
<h:outputLabel for="period" value="Period" id="periodLabel" rendered="#{ppBacker.periodRendered}">
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
并在<p:ajax update属性中引用包装器(总是在DOM树中)id ,如下所示:
<p:ajax process=":addProgram:addProgramTo" update=":addProgram:periodGrid, :addProgram:periodLabelWrapper" event="change" listener="#{ppBacker.addProgramListener}" />
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是更新整个表单,就像<p:ajax update="@form" ...你不需要包装那样outputLabel
关于你的评论问题
@form如何更新未渲染的元素,但是直接通过id瞄准它们呢?
您无法定位update页面中不存在的元素(呈现= false)"它不存在"
但是当你使用update="@form"或update="someWrapperID"表单/包装"重新评估"它的所有内部元素,包括那些rendered="#{someBean.someCondition}"和条件得到"重新评估",所以如果它导致trueelemet将显示...