我有一个包含不同计算的页面,这些计算是由ajax完成的
页面末尾应该有一个提示文本,每次计算后都会更新。
为此,我使用Primefaces的autoUpdate
特性。
当我最初加载页面时,文本显示正确。同样,在第一次计算之后,文本会被正确刷新。但如果我做进一步的计算,无论balanceController.getBalance()
返回哪个值,文本都不会再更改
调试代码时,我会看到balanceController.getDetails()
正确运行,并返回所需的文本。只有我页面上的内容没有刷新。当我手动重新加载页面(使用浏览器(时,会显示正确的文本。
<p:autoUpdate/>
仅在第一次计算期间执行并更新选项卡内容的原因是什么?
balancePage.xhtml
<p:tab title="Further details" rendered="#{balanceController.showDetails()}">
<p:autoUpdate/>
<h:outputText value="#{balanceController.details}"/>
</p:tab>
BalanceController.java
public String getDetails() {
if ( getBalance() >= 0 ) {
return "Your current balance is: " + Double.toString(getBalance());
} else {
return "Your credit has been used up!";
}
}
通常,p:tab
是不可更新的,因为渲染p:tab
的是父组件。可能是p:accordionPanel
或p:tabView
。
因此,您可以将p:autoUpdate
移动到父组件,也可以将其移动到h:outputText
内部。
注意:您可能需要向h:outputText
添加一个id,因为只有具有已渲染id
的组件是可更新的,并且当没有显式设置id
属性时,h:outputText
会跳过渲染id
。
也可以通过将其封装为p:outputPanel
:来解决此问题
<p:tab title="Further details" rendered="#{balanceController.showDetails()}">
<p:outputPanel>
<p:autoUpdate/>
#{balanceController.details}
</p:outputPanel>
</p:tab>
由于性能原因,我删除了h:outputText
。IMO不应将h:outputText
用于简单文本(escape
未设置为false
(,因为这会在服务器侧创建不需要的UICompoment
。