您无法更新未渲染的元素,rendered=false
“是一种 JSF 方法”,用于从 DOM 树中删除元素,
它不像CSSdisplay:none
or visibility:hidden
rendered=false甚至不会渲染(保留)DOM 树中的元素(您甚至不会在页面的“查看源代码”中看到它)
所以在你的情况下你需要包装outputLabel
使用 `panelGroup' 并更新包装器的 id
<h:panelGroup id="periodLabelWrapper">
<h:outputLabel for="period" value="Period" id="periodLabel" rendered="#{ppBacker.periodRendered}">
</h:panelGroup>
并引用包装器(始终位于 DOM 树中)id<p:ajax
update
属性,像这样:
<p:ajax process=":addProgram:addProgramTo" update=":addProgram:periodGrid, :addProgram:periodLabelWrapper" event="change" listener="#{ppBacker.addProgramListener}" />
另一个解决方案是像这样更新整个表单<p:ajax update="@form" ...
这样你就不需要包装了outputLabel
关于您的评论问题
@form 如何更新未渲染的元素,但通过 id 直接定位它们则不然?
您不能将某个元素定位为update
页面中不存在(rendered=false)“它不存在”
但是当你使用update="@form"
or update="someWrapperID"
表单/包装器“重新评估”其所有内部元素,包括带有rendered="#{someBean.someCondition}"
并且条件会被“重新评估”,所以如果结果是true
该元素将显示...