如何在 managedbean 中更改后呈现视图组件?

How to render view component after being altered in the managedbean?

我有一个输出文本显示屏幕上的服务数量:

<h:outputText
        value="Services #{bean.counterManager.serviceCounter}">
</h:outputText>

下面是一个调用 getServices() 方法的手风琴面板:

        <p:accordionPanel value="#{bean.services}" var="service">

getServices() 方法中,我增加了计数器,当我在 return 点调试时,它是 143。

public List<Service> getServices() 
{
    if (this.services.isEmpty())
    {
        //Does other stuff, fills this.Services
        this.counterManager.incrementServiceCounter(someValue); //
    }
    return this.services;
}

但它在屏幕上显示为 0,因为 getServices() 在 outputText 调用之后被调用 getCounterManager() 可能是因为 outputtext 在我的 XHTML 上的手风琴面板上方。

我希望 serviceCounter 显示 143 而不是 0,但我不知道如何在调用 getLinhasStruct() 后呈现它,我不能将它放在手风琴面板下方的输出文本,因为那样会弄乱与页面布局有关,我该怎么做?

切勿在 getter 秒内执行业务逻辑。您需要确保所有 getters(和 setter)都是纯 getters(和 setter)。

public List<Service> getServices() {
    return services;
}

在您的 IDE 在 bean class 的最底部自动生成它们之后,永远忽略它们。不要触摸它们。就当它们不存在一样。您应该在操作事件侦听器中执行业务逻辑。

你的具体问题是因为那些 getter 方法在渲染响应阶段以与组件在树中出现的顺序相同的顺序调用,并且你的代码错误地依赖于内部无法控制的东西支持 bean。

您在问题中没有说明具体的功能需求,因此很难指出正确的方法,但通常有以下方法,具体取决于您希望何时执行业务逻辑.

  1. 在初始 GET 请求期间?使用 <f:viewAction>.
  2. 就在渲染视图之前?使用 <f:event type="preRenderView">.
  3. bean 初始化期间?使用 @PostConstruct.

另请参阅:

  • Why JSF calls getters multiple times
  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
  • When to use f:viewAction / preRenderView versus PostConstruct?