在primefaces <p:tabview>中停止TabChange

时间:2015-05-07 08:57:21

标签: jsf-2 primefaces tabview

我正在使用Primefaces 5并使用具有severl标签的。

在每个标签中,我都有一个dataTable,可以根据用户操作进行编辑或不编辑。

如果用户正在编辑某行,我希望保留在同一个标​​签中并阻止标签更改,否则请转到单击的标签页。我该怎么办?

这是我的xhtml:

<p:tabView  id="customerTab"
            orientation="left"
            dynamic="false"
            cache="false" 
            widgetVar="detailsTab" 
            activeIndex="#{myBean.activTab}"
            >

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


        <p:tab  tab1> </p:tab>
        <p:tab  tab2> </p:tab>

这是我的支持bean:

public void onTabChange(
        TabChangeEvent event) {
    if (Tab.isInEditMode()) {

        FacesMessage msg = new FacesMessage("Tab Changed", "Active Tab: " + event.getTab().getId()
                + "You can not change the tab when you are in Edit mode!");
        FacesContext.getCurrentInstance().addMessage(null, msg);

        this.messagesTab.setActiveIndex(0);
        //          //          RequestContext.getCurrentInstance().execute("tabWidget.select(0)");
        activTab = 0;

        FacesContext.getCurrentInstance().setProcessingEvents(false);


    } else {
                TabView tabView = (TabView) event.getComponent();
                int activeIndex = tabView.getChildren().indexOf(event.getTab());
                this.messagesTab.setActiveIndex(activeIndex);
                activTab = activeIndex;
    }

}

3 个答案:

答案 0 :(得分:2)

简而言之,解决方案归结为:

  1. 在rowEditInit ajax事件的onstart中,设置一个处于编辑模式的客户端变量
  2. 在rowEditCancel事件的oncomplete中,设置您处于非编辑模式的客户端变量
  3. 在rowEdit事件的oncomplete中,设置您处于非编辑模式的客户端变量
  4. 在选项卡更改事件的onstart中,编写一些检查此编辑变量值的javascript,如果处于编辑模式,则返回false。 tabChange应该。如果处于非编辑模式,则返回true并发生tabChange
  5. 抱歉,我没有为您提供一个完整的例子。这主要是因为我不想/没有时间来编写它(由于这样的复杂性原因,我从未使用内联编辑)并且认为人们学习&#39;更多来自提示然后完全解决了代码。

答案 1 :(得分:0)

我在tabView和嵌套的动态元素(如dataTable)中遇到了很多问题。所以我现在只使用tabView作为触发器。这意味着tabView具有选项卡,但选项卡内部不是元素。我对ajax监听器做出反应以更改选项卡更新并更新我的UI中的特定区域,该区域显示应该位于选项卡内的内容。 对于您的问题,这可能是一个解决方案。编辑dataTable时,可以忽略制表符更改事件。 或者使用禁用选项卡属性禁用其他选项卡。

答案 2 :(得分:0)

我的解决方案是使用一些javascript。为了停止tabchange:

<p:tabView id="tabView" activeIndex="#{controller.tabSelected}"  onTabChange="handleTabChange(index);return false;"

检查primefaces_user_guide_6_2中的handleTabChange函数。

我还需要p:remoteCommand将新选择的选项卡发送到Bean。