我正在尝试创建一个动态面板(包含各种项目的面板),然后我想在视图页面中将它与面板组件绑定,具有面板对象的托管bean的范围是@ViewScoped
。
我注意到任何ajax
渲染视图页面中的这个面板都会重建托管bean,为什么会这样?
这是我的代码:
这是托管bean:
package test;
import org.icefaces.ace.component.panel.Panel;
@ManagedBean(name = "myBean")
@ViewScoped
public class myBean {
private Panel myPanel;
// Constructor
public myBean() {
myPanel = drawPanel(); // this function initiate and add items to the panel
}
// Setters and Getters Methods
}
以及查看页面:
<h:form>
<ace:panel binding="#{myBean.myPanel}"></ace:panel>
<ace:pushButton actionListener="#{myBean.something}">
<ace:ajax render="@form" />
</ace:pushButton>
</h:form>
每次按下按钮,调用托管bean构造函数,为什么会发生这种情况? 另外我注意到,如果我从面板组件中删除绑定属性或者创建托管bean会话或应用程序范围的范围,则不会调用构造函数。
注意:我正在使用icefaces 3和jsf 2.0。
这种情况有解决方案吗?
答案 0 :(得分:0)
正如ICEFaces文档所说:
按钮是一个允许输入完整表单或仅输入自身的组件。它具有与常规jsf命令按钮相同的功能,但无需添加额外属性。
因为PushButton是一个命令按钮,所以它会进行导航。如果您不使用其操作属性,则会应用其默认值。我无法找到它是什么(我只是怀疑它是一个空字符串)。
JSF导航规则取决于UICommands的操作结果:
null或void :重新加载当前视图
空字符串:重新创建当前视图(如果重新创建视图,视图范围内的bean也会这样做)
非空字符串:导航处理程序确定的下一个视图。
如果原因是action属性的空字符串默认结果,则在facet中使用它:
<ace:pushButton action="#{myBean.nextPage}" actionListener="#{myBean.something}">
并在其链接的处理程序方法中传回一个空值:
public class MyBean // You use myBean here in your question improperly
{
public String nexPage()
{ return null; }
}