刷新选项卡更改事件的模型数据

时间:2017-09-19 14:37:14

标签: primefaces jsf-2 tabview

我正在使用primefaces tabView组件。每个标记都有自己的托管bean和引用该bean的.xhtml页面。 问题是单击了EACH TIME选项卡,应该从数据库中提取新数据(不仅仅是第一次),换句话说,应该刷新数据。 我的豆子是@ViewScoped。我不想使用@RequestScoped,因为我有非常动态的启用Ajax的页面。

我的解决方案目前看起来像这样: 我使用tabView组件(MainBean)为主页提供了托管bean,其中包含处理tabChange事件的方法。 该bean还引用了分配给每个选项卡(TabBean1TabBean2)的bean,以便根据所选选项卡的id刷新右bean。

MainBean:

@ManagedBean(name = "mainBean")
@ViewScoped
public class MainBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{tabBean1}")
    private TabBean1 tabBean1;

    @ManagedProperty(value = "#{tabBean2}")
    private TabBean2 tabBean2;

    public void onTabChange(TabChangeEvent event) {
        String id = event.getTab().getId();

        if ("tab1Id".equals(id)) {
            tabBean1.init();
        } else if ("tab2Id".equals(id)) {
            tabBean2.init();
        } 
    }

    public TabBean1 getTabBean1() {
        return tabBean1;
    }

    public void setTabBean1(TabBean1 tabBean1) {
        this.tabBean1 = tabBean1;
    }

    public TabBean2 getTabBean2() {
        return tabBean2;
    }

    public void setTabBean2(TabBean2 tabBean2) {
        this.tabBean2 = tabBean2;
    }

}

TabBean1:

@ManagedBean(name = "tabBean1")
@ViewScoped
public class TabBean1 implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<String> data;

    @PostConstruct
    public void init() {
        // refresh data
    }
}

TabBean2:

@ManagedBean(name = "tabBean2")
@ViewScoped
public class TabBean2 implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<String> data;

    @PostConstruct
    public void init() {
        // refresh data
    }

}

相关部分od main.xhtml:

<p:tabView id="tabViewID" cache="false" dynamic="true">

    <p:ajax event="tabChange" listener="#{mainBean.onTabChange}" />

    <p:tab title="Tab 1" id="tab1Id">
        <ui:include src="tab1Page.xhtml" />
    </p:tab>

    <p:tab title="Tab 2" id="tab2Id">
        <ui:include src="tab2Page.xhtml" />
    </p:tab>

</p:tabView>

这种方法的问题是:

  • 构建MainBean时,也会构造其所有托管属性。这是一个很大的问题,因为每个bean的@PostConstruct方法从数据库中获取一些数据而且一切都太慢了,因为只有一个bean应该被初始化(分配给选定选项卡的那个),所有bean都被初始化了。
  • 在第一页加载时,init()方法被TabBean1调用两次,一次因@PostConstruct而被调用一次,因为它被分配到tabChange事件(第一个标签被选中)默认情况下)

我的问题是:

  • 如何在点击相应的标签时“刷新bean数据”?
  • 如何动态执行此操作,仅针对所选标签(最初和每次点击后)?

我真的很感激你的建议。谢谢!

我正在使用Primefaces 6.0,JSF 2.2。

0 个答案:

没有答案