【问题标题】:How to bind a component with an object in view scoped managed bean?如何在视图范围的托管 bean 中将组件与对象绑定?
【发布时间】:2017-03-28 18:16:24
【问题描述】:

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

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

【问题讨论】:

    标签: jsf managed-bean icefaces


    【解决方案1】:

    正如 ICEFaces 文档所说:

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

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

    JSF 导航规则取决于 UICommands 的操作结果:

    • null or 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; }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 2013-01-15
      • 2016-01-02
      • 2011-09-29
      • 1970-01-01
      • 2012-12-26
      • 2013-09-11
      相关资源
      最近更新 更多