如何在 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。
您在问题中没有说明具体的功能需求,因此很难指出正确的方法,但通常有以下方法,具体取决于您希望何时执行业务逻辑.
- 在初始 GET 请求期间?使用
<f:viewAction>
.
- 就在渲染视图之前?使用
<f:event type="preRenderView">
.
- 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?
我有一个输出文本显示屏幕上的服务数量:
<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。
您在问题中没有说明具体的功能需求,因此很难指出正确的方法,但通常有以下方法,具体取决于您希望何时执行业务逻辑.
- 在初始 GET 请求期间?使用
<f:viewAction>
. - 就在渲染视图之前?使用
<f:event type="preRenderView">
. - 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?