1

ajax で部分的に更新しようとすると、primefaces にバグがあると思います。同じ質問をプライムフェイス フォーラムに投稿しましたが、誰からも返信がありません。

2 つのタブを持つ tabView がある例を添付しました。[新しいタブのコンテンツを読み込む] ボタンをクリックすると、バッキング Bean が呼び出され、tab1 のコンテンツが動的に変更されます。tab1 の既存のコンテンツをクリアし、この場合は単なる inputText である新しいコンテンツをロードする必要があります。次に、RequestContext.getCurrentInstance().update(updateIds) メソッドを使用して、tab1 自体を更新することを示します。問題は、タブのタイトルが変更されず、新しい inputText コンテンツが tab1 と tab2 の両方に配置されることですが、tab2 に対して何も指定しなかったため、新しい inputText も取得した理由がわかりません。このコードを使用して、同じ結果が得られるかどうかを確認するか、何か間違っている場合は修正してください。

  • プライムフェイス3.5
  • Mojarra JSF API (javax.faces/2.1) 2.1.15 (20121116-1711)
  • Mojarra JSF 実装 (javax.faces/2.1) 2.1.15 (20121116-1711)
  • トムキャット 7.0.32
  • JDK1.6.0_07

**

dynamicTabLoading.xhtml

**

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:p="http://primefaces.org/ui"   >

    <h:head>
      <title>Prime Prototype Dynamic Tabs</title>
   </h:head>

   <h:body>

      <h:form id="myForm">
         <p:panel>
            <h:outputText value="Dynamic Tab Loading..."></h:outputText>
            <p:commandButton id="loadTabContentBtn" value="Load New Tab Content"
                  actionListener="#{tabManager.loadNewTabContent}"  />


            <p:tabView id="tabView1" binding="#{tabManager.tabViewComponent}" dynamic="true" >

               <p:tab id="tab1" title="Tab 1" closable="true" >   
                  <h:outputText value="blank 1" />
               </p:tab>

               <p:tab id="tab2" title="Tab 2" closable="true" >   
                  <h:outputText value="blank 2" />
               </p:tab>      

            </p:tabView>   

         </p:panel>
      </h:form>

      <!-- TODO remove for production -->
      <ui:debug />

   </h:body>

</html>

**

TabManager.java

**

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.component.UIComponent;

import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.tabview.Tab;
import org.primefaces.component.tabview.TabView;
import org.primefaces.context.RequestContext;

@ManagedBean
public class TabManager {

   private TabView tabViewComponent;

   public void loadNewTabContent() {

      /* get list of tabs from tabView*/
      List<UIComponent> tabs = getTabViewComponent().getChildren();

      /* get the first tab which had id="tab1" */
      Tab targetTab = (Tab)tabs.get(0);
      System.out.println("Target Tab Id is " + targetTab.getClientId());

      /* clear the tabs current content */
      targetTab.getChildren().clear();

      /* set new tab title and new content */
      targetTab.setTitle("Tab 1 Changed");            
      InputText inputTxt = new InputText();
      inputTxt.setValue("This is new content for Tab 1 ");
      targetTab.getChildren().add(inputTxt);

      List<String> updateIds = new ArrayList<String>();
      updateIds.add(targetTab.getClientId());

      RequestContext.getCurrentInstance().update(updateIds);
   }

   public TabView getTabViewComponent() {
      return tabViewComponent;
   }

   public void setTabViewComponent(TabView tabViewComponent) {
      this.tabViewComponent = tabViewComponent;
   }

}

ありがとう

4

1 に答える 1

0

tabview がロードされると、コンテンツがキャッシュに入れられます。そのため、リロードするときにコンテンツが更新されません。同じ問題を解決するには、タブビューのプロパティで dynamic="true" と cache="false" を使用してみてください。

于 2015-05-14T06:46:46.427 に答える