2011-11-22 156 views
5

我想動態添加Primefaces組件。我使用的解決方案類似this one,這是有前面討論:動態添加Primefaces組件

<h:form> 
    <h:panelGrid columns="2"> 
     <p:dataGrid id="categoriesGrid" value="#{bean.categories}" 
      var="categoryBean" rowIndexVar="rowIndex"> 
      <p:column> 
       <p:selectOneMenu id="categorySelect" effect="drop" 
        value="#{categoryBean.selectedCategory}" > 
        <f:selectItems value="#{categoryBean.availableCategories}" 
         var="category" itemLabel="#{category.name}" 
         itemValue="#{category}" /> 
       </p:selectOneMenu> 
      </p:column> 
     </p:dataGrid> 
     <p:commandButton actionListener="#{bean.addNewCategory}" 
      value="Add category" update="categoriesGrid"/> 
    </h:panelGrid> 
</h:form> 

但有問題的。有響應的例子是點擊「添加類別」按鈕後,我得到:

<?xml version='1.0' encoding='UTF-8'?> 
<partial-response> 
<error> 
    <error-name> 
     class javax.faces.component.UpdateModelException 
    </error-name> 
    <error-message> 
     <![CDATA[/createTutorial.xhtml @85,65 value= 
      "#{categoryBean.selectedCategory}":java.util.NoSuchElementException]]> 
    </error-message> 
</error> 
</partial-response> 

在此先感謝

+0

正如我找到[那裏](http://code.google.com/p/primefaces/issues/detail?id=1568),必須添加'p:column',但是ajax的問題​​仍然存在 – nikagra

+0

請將您的解決方案發布爲答案(您可以稍後自行接受)。 – oers

+0

是的,當然) – nikagra

回答

2

的問題是與我的豆。爲了獲得選定的項目,我必須實現​​接口的自定義實現。在我看來,爲這樣一個簡單的問題做了很多工作(這個轉換器必須能夠訪問數據源等等)。所以我做了一個小竅門:

public class CategoryBean{ 

    private list<Category> availableCategories; 
    private Category selectedCategory; 

    public Long getCSelectedCategory(){ 
     // Get selected category by it's id and set selectedCategory 
    } 

    public void setSelectedCategory(Long selectedCategory){ 
     return selectedCategory.getId(); 
    } 

    // The remaining setters and getters 
} 

和網頁代碼對應的一塊現在看起來像:

<p:column> 
    <p:selectOneMenu id="categorySelect" effect="drop" 
     value="#{categoryBean.selectedCategory}" > 
     <f:selectItems value="#{categoryBean.availableCategories}" 
      var="category" itemLabel="#{category.name}" 
      itemValue="#{category.id}" /> 
    </p:selectOneMenu> 
</p:column> 

請,要請你注意所顯示的itemValue屬性和訪問方法。我得到的錯誤是getter返回類型錯誤。

結束,在我的情況下動態添加新的Primefaces組件的唯一問題是返回選定的值。你可以實現轉換器或使用類似的技巧。

在你看來,這樣的竅門是一個很好的解決方案嗎?

+0

如果這是你的最終代碼,那麼它看起來不好,你的詭計並不是一個好的竅門。因爲,如果你看看這個'value =「#{categoryBean.selectedCategory}」'和這個'itemValue =「#{category.id}」',它看起來很混亂。我認爲在這種情況下使用轉換器是一種很好的做法。 –

+0

Tnx,我正在使用轉換器,代碼暫時和平 – nikagra