Primefaces自动更新仅适用一次

时间:2020-03-10 15:12:53

标签: jsf primefaces

我的页面上有不同的计算,这些计算是由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!";
    }
}

1 个答案:

答案 0 :(得分:6)

通常,p:tab是不可更新的,因为呈现p:tab的那个是父组件。可能是p:accordionPanelp:tabView

因此,您可以将p:autoUpdate移动到父组件,也可以将其移动到h:outputText内。

注意:您可能需要向h:outputText添加一个ID,因为只有具有渲染的id的组件才是可更新的,而h:outputText会在没有{{1 }}属性已明确设置。

也可以通过将其包装id来解决它:

id

我出于性能原因删除了p:outputPanel。 IMO不应将<p:tab title="Further details" rendered="#{balanceController.showDetails()}"> <p:outputPanel> <p:autoUpdate/> #{balanceController.details} </p:outputPanel> </p:tab> 用于简单文本(h:outputText未设置为h:outputText),因为这会在服务器端创建escape,这不是必需的。