我有一个输出文本显示屏幕上的服务数量:
<h:outputText
value="Services #{bean.counterManager.serviceCounter}">
</h:outputText>
在它下面是一个调用getServices()方法的accordionpanel:
<p:accordionPanel value="#{bean.services}" var="service">
在getServices()
方法中,我递增计数器,当我在返回点调试时,它是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()
之后被调用,可能是因为输出文本位于我的XHTML上的accordionpanel之上。
我希望serviceCounter显示143而不是0,但是在调用getLinhasStruct()后我不知道如何使它渲染,我不能把它放在手风琴面板下面的outputtext因为这会弄乱页面的布局,所以我该怎么做?
答案 0 :(得分:1)
永远不要在getter中做业务逻辑。你需要确保所有的getter(和setter)都是纯粹的getter(和setter)。
public List<Service> getServices() {
return services;
}
在IDE自动生成bean类的最底层之后,只需永远忽略它们。别碰它们。好像它们不存在一样。您应该在动作事件侦听器中执行业务逻辑。
您的具体问题是由于那些getter方法在渲染响应阶段被调用的顺序与组件出现在树中的顺序相同,并且您的代码错误地依赖于从辅助bean内部无法控制的内容。
你没有说明问题中的具体功能要求,因此有点难以指出正确的方法,但总的来说,以下方法取决于你何时想要执行业务逻辑。
<f:viewAction>
。<f:event type="preRenderView">
。 @PostConstruct
。