【问题标题】:Primefaces autoUpdate only works oncePrimefaces 自动更新只工作一次
【发布时间】:2020-03-10 15:12:53
【问题描述】:

我有一个由 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!";
    }
}

【问题讨论】:

  • rendered属性false第二次吗?看this
  • 不,渲染的attributetrue,只是应用启动时加载的属性。
  • 也许可以尝试通过 id 进行更新。还要检查浏览器的控制台 (F12)
  • 总是minimal reproducible example 和版本信息!
  • 如果您在 jsf/primeFaces 面板而不是选项卡中尝试此操作,那么它是否也只能工作一次?提示:您不能仅更新单个选项卡的内容或整个选项卡视图

标签: jsf primefaces


【解决方案1】:

一般来说p:tab 是不可更新的,因为渲染p:tab 的是父组件。可能是p:accordionPanelp: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,这不是必需的。

【讨论】:

  • “一般来说p:tab 是不可更新的” 什么时候?据我所知,它从来不是......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多