2012-06-23 118 views
0

我在過去的2天裏一直堅持這樣做,並且很難理解Primefaces如何根據它們的ID更新客戶端上的UI組件。在onchange事件被觸發後,JSF 2/Primefaces p:ajax沒有更新面板

我有一個h:selectOneMenu計數面板的數量顯示。每個p:面板都將包含一個包含衆多表單元素的panelGrid。下拉菜單中的onchange事件被觸發,我可以看到Managed Bean中的計數。雖然我沒有看到在客戶端動態增加面板,但我認爲p:ajax params有問題,但我完全不瞭解它是如何工作的。這裏是相關代碼:

<h:selectOneMenu id="numapps" value="#{mbean.appCount}"> 
       <f:selectItem itemLabel="1" itemValue="1" /> 
       <f:selectItem itemLabel="2" itemValue="2" /> 
       <f:selectItem itemLabel="3" itemValue="3" /> 
       <f:selectItem itemLabel="4" itemValue="4" /> 
       <f:selectItem itemLabel="5" itemValue="5" /> 
       <p:ajax update="appsContainer" event="change" 
        listener="#{mbean.onChangeNumApps()}" />  
    </h:selectOneMenu> 

    <p:panel id="appsContainer" > 
      <p:panel header="Application" id="appsPane" value="#{mbean.submittedApps}" var="app" multiple="true"> 

submittedApps是一個包含面板表單元素的列表。這是我的MBean偵聽:

public void onChangeNumApps() 
{ 
    List<Apps> c = new ArrayList<Apps>(); 
    logger.info("on change event fired"); 
    logger.info("new value is "+mbean.getAppCount()); 
    for (int i=0;i < mbean.getAppCount();i++) 
    { 
     c.add(new App()); 
    } 
    mbean.setSubmittedApps(c); 
} 

我混號碼:阿賈克斯與H:selectone因爲我無法獲得號碼:selectone工作出於某種原因 - 可能是因爲我的樣式表一個CSS碰撞?

回答

0

從JSF樹中添加/刪除動態組件非常簡單。 儘管我主要在RF和JSF2.0上工作,所以我無法在primefaces的代碼方面爲您提供很多幫助,但是我可以列出可以遵循的步驟,以便根據收到的數字添加動態組件valuechange監聽器。

在您的文章,你需要有基於來自

提交本上valuechanelistener您可以獲取所選擇的面板數的值值的表單元素的動態數量。

  1. 您在valuechangelistener中創建一個新面板。
  2. 根據從valuechangelistener收到的編號創建所需的表單元素。
  3. 將這些元素作爲子元素添加到面板。
  4. 將此面板作爲孩子添加到以前出現在頁面上的面板。

而不是手動分配ID到每個動態組件,您可以使用JSF內置唯一ID功能,它會自動爲您提供唯一的ID。 如果您需要進一步使用extarcting values的動態組件,那麼您需要將ID存儲在單獨的集合中,然後根據ID可以獲取動態組件的值。

爲了獲得唯一ID部件: -

FacesContext.getCurrentInstance()getViewRoot()createUniqueId();

若要將組件動態地添加到JSF樹請看下面所提到的代碼片段: -

HtmlPanelGrid panelGrid=new HtmlPanelGrid(); 
panelGrid.setColumns(2); 
String uniqueId=FacesContext.getCurrentInstance().getViewRoot().createUniqueId(); 
panelGrid.setId(uniqueId); arrLstComponentIds.add(uniqueId); 
HtmlInputText inputText = new HtmlInputText();  
HtmlOutputLabel outputLabel=new HtmlOutputLabel(); 
              panelGrid.getChildren().add(outputLabel); 
panelGrid.getChildren().add(inputText); 
htmlGridElement = new HtmlPanelGrid();  htmlGridElement.getChildren().add(panelGrid); 

你需要重新呈現您的面板,這樣在JSF樹中的變化反映。

0

得到它與UI的工作:重複,而不是迭代面板。