有没有人能解决这个问题:
在我的应用程序中,我使用基于primefaces仪表板的复杂的,以编程方式构建仪表板。为了克服构建仪表板的面板的非唯一id的问题,我将这个组件绑定到请求范围的bean。我还想在单击commandButton后根据一些可更改的参数重建仪表板。
问题是,在启动commandButton的actionListener之前(在Invoke Application阶段),在Apply Request Values阶段触发仪表板的getter。因此,虽然仪表板最终会重建,但在渲染的响应中并没有刷新。
另一方面,如果我尝试将按钮的immediate属性设置为true,则会在Apply Request Values阶段触发actionListener,但仍会在getter之后触发。比生命周期直接进入渲染响应阶段,结果是相同的。
任何?
谢谢你的回答。让我为我的问题添加一些细节。
我将体育锦标赛的模型存储为会话范围bean的属性。它是这样的:豆有一个属性“锦标赛”。这个类有一个组列表,每个组都有它的匹配表。我们的想法是使用三种不同的编程构建组件作为此锦标赛模型的渲染器。
仪表板将用于群组中参赛者放置的拖放版本。为了查看匹配表并编辑匹配,我使用一个选项卡面板,每个表都有面板网格。最后,我使用面板网格来显示锦标赛树。这三个组件中的每一个都会呈现模型的某些部分供用户编辑。
由于模型(以及因此那些渲染组件)是动态构建depanding on chosable参数,例如组数,我在将它们绑定到会话范围的bean时遇到了id uniqnes的问题。所以我将它们绑定到请求范围的bean。随着每个请求更改模型(主要是ajax),我想根据用户设置的参数(也存储在会话范围的bean中)重新渲染这些组件。
问题是,当我在调用应用程序阶段重建模型时(在“rebuild-my-model”按钮触发的动作侦听器中),绑定到请求范围的bean的组件已经“获取” -ed“来自bean(或者看起来似乎),并且它们不会在页面上刷新。
如果上面提到的方法完全是愚蠢的话,我会非常感谢能够解决我的错误,也许是一个建议:)
答案 0 :(得分:1)
问题是,在启动commandButton的actionListener之前,在Apply Request Values阶段触发了仪表板的getter
我不确定为什么这对你来说是个问题。也许您在getter方法中而不是在动作侦听器方法中错误地执行业务逻辑?或者您可能是手动创建组件而不是引用JSF创建的组件,因此总是覆盖JSF视图中的组件?
正确的JSF getter方法基本上如下所示:
public UIComponent getDashboard() {
return dashboard;
}
它应不包含任何其他代码行。顺便说一下,这同样适用于setter方法。需要操作组件子项的任何操作都需要在操作(侦听器)方法中完成,而不是在getter / setter方法中完成。