如何在视图作用域托管bean中绑定组件与对象?

时间:2017-03-28 18:16:24

标签: jsf managed-bean icefaces

我正在尝试创建一个动态面板(包含各种项目的面板),然后我想在视图页面中将它与面板组件绑定,具有面板对象的托管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。

这种情况有解决方案吗?

1 个答案:

答案 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; }
}