Jsf 如何将组件与视图范围的托管bean中的对象绑定?

Jsf 如何将组件与视图范围的托管bean中的对象绑定?,jsf,managed-bean,icefaces,Jsf,Managed Bean,Icefaces,我正在尝试创建一个动态面板(包含各种项目的面板),然后我想将其与视图页面中的面板组件绑定,具有面板对象的托管bean的范围是@ViewScoped。 我注意到任何ajax在视图页面中呈现这个面板都会重建托管bean,这是为什么? 这是我的密码: 这是托管bean: package test; import org.icefaces.ace.component.panel.Panel; @ManagedBean(name = "myBean") @ViewScoped public clas

我正在尝试创建一个动态面板(包含各种项目的面板),然后我想将其与视图页面中的面板组件绑定,具有面板对象的托管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构造函数就会被调用,为什么会发生这种情况? 我还注意到,如果我从面板组件中删除binding属性,或者创建托管bean会话的作用域或应用程序作用域,则构造函数不会被调用

注意:我使用的是IceFaces3和JSF2.0


这种情况有什么解决办法吗?

正如ICEFaces文档所说:

按钮是一个组件,允许输入完整的表单或仅输入其本身。它具有与常规jsf命令按钮相同的功能,但不必添加额外的属性

因为按钮是一个命令按钮,所以它可以进行导航。如果不使用其action属性,它将应用其默认值。我找不到它是什么(我只是怀疑它是一个空字符串)

JSF导航规则取决于UIC命令的操作结果:

  • null或void:重新加载当前视图

  • 空字符串:重新创建当前视图(如果重新创建了视图,视图范围的bean也会这样做)

  • 非空字符串:导航处理程序确定的下一个视图

如果原因是action属性的空字符串默认结果,则在方面中使用它:

<ace:pushButton action="#{myBean.nextPage}" actionListener="#{myBean.something}">
public class MyBean // You use myBean here in your question improperly
{
  public String nexPage()
  { return null; }
}