我见过类似的问题,但是找到了答案...平台是JSF 2.2.6,Primefaces,Derby DB with Eclipse
我有两个实例,我正在切换一个项目以影响另一个项目,而ajax则提供更新。它们对我来说似乎是一样的,除了一个更新在表单内,另一个更新在外面。 “item”指的是使用布尔而不是布尔值的derby实体,这就是测试为== true的原因。这是XHTML部分:
<p:growl id="msg"/>
<h:form>
<h:outputLabel value="Team event? " />
<p:selectBooleanButton value="#{events.item.teamEvent}" onLabel="Yes" offLabel="No">
<p:ajax update="teamSize" listener="#{events.changeTeamEvent()}"/>
</p:selectBooleanButton>
<h:outputLabel for="teamSize" id="teamSizeLabel" rendered="#{events.item.teamEvent==true}" value="Team size: "/>
<p:inputText id="teamSize" rendered="#{events.item.teamEvent==true}" value="#{events.item.teamSize}"
validatorMessage="Team size must be between 2 and 4">
<f:validateLongRange minimum="2" maximum="4" />
</p:inputText>
<br/>
<h:outputLabel value="Allow signup? " />
<p:selectBooleanButton value="#{events.item.allowSignup}" onLabel="Yes" offLabel="No">
<p:ajax update=":msg" listener="#{events.changeSignup()}"/>
</p:selectBooleanButton>
</h:form>
支持bean是会话范围的,并且使用调试器证明了属性已更新,侦听器被调用。既不会改变属性。 在侦听器完成所有适当的集合之后,在渲染阶段也会调用实体文件,但在我的示例中只有第二个p:selectBooleanButton正确呈现。另一个更改按钮,但团队大小信息永远不会更改。当我刷新浏览器(最新的Chrome)时,它确实正确显示。我怀疑是我的渲染测试是错误的,但刷新应该适用于那种情况。我还尝试了更新属性“teamSize”,“:teamSize”,“teamSize teamSizeLabel”的许多变体。我想要最后一个例子,但试图展示一个简单的例子。
我认为这很简单,但我看不到它。
答案 0 :(得分:2)
您的问题是您正在尝试更新依赖于呈现的项目。 它可能并不存在于DOM中。
您的渲染项目需要使用始终可更新的div进行包装。见下文
<h:panelGroup layout="block" id="dataUpdate">
<h:outputLabel for="teamSize" id="teamSizeLabel" rendered="#{events.item.teamEvent==true}" value="Team size: "/>
<p:inputText id="teamSize" rendered="#{events.item.teamEvent==true}" value="#{events.item.teamSize}" validatorMessage="Team size must be between 2 and 4">
<f:validateLongRange minimum="2" maximum="4" />
</p:inputText>
</h:panelGroup>
然后在你的第一个布尔框中设置它以更新&#39; dataUpdate&#39;代替。
或者你可以做@form,因为它是一个小形式