2011-11-22 33 views
5

Tôi muốn thêm linh kiện Primefaces theo kiểu động. Tôi đang sử dụng giải pháp tương tự như this one, đã được thảo luận ở đó sớm hơn:Thêm thành phần Primefaces động

<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> 

Nhưng có vấn đề với nó. Có ví dụ về phản ứng tôi nhận được sau khi nút "Thêm thể loại" được nhấp:

<?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> 

Cảm ơn trước

+0

Như tôi đã tìm thấy [ở đó] (http://code.google.com/p/primefaces/issues/detail?id=1568), 'p: column' phải được thêm vào, nhưng sự cố với ajax vẫn tồn tại – nikagra

+0

Vui lòng đăng giải pháp của bạn dưới dạng câu trả lời (bạn có thể tự chấp nhận sau này). – oers

+0

Có, tất nhiên) – nikagra

Trả lời

2

Vấn đề là với đậu của tôi. Để nhận được mục đã chọn, tôi phải triển khai thực hiện tùy chỉnh giao diện javax.faces.Converter. Theo tôi, có khá nhiều việc phải làm cho vấn đề đơn giản như vậy (bộ chuyển đổi này phải có khả năng truy cập nguồn dữ liệu và vân vân). Vì vậy, tôi đã thực hiện một mẹo nhỏ:

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 
} 

Và mảnh tương ứng của mã trang bây giờ trông giống như:

<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> 

Xin vui lòng, chú ý của mình vào itemValue thuộc tính và truy cập các phương pháp đó được hiển thị. Lỗi mà tôi có là loại trả về getter sai.

Kết luận, vấn đề duy nhất khi thêm thành phần Primefaces mới động trong trường hợp của tôi là trả lại giá trị đã chọn. Bạn có thể thực hiện chuyển đổi hoặc sử dụng thủ thuật tương tự.

Bí quyết đó có phải là giải pháp tốt theo ý kiến ​​của bạn không?

+0

Nếu đây là mã cuối cùng của bạn thì nó không có vẻ tốt và mẹo của bạn không phải là một mẹo hay. Bởi vì, nếu bạn xem xét giá trị 'value =" # {categoryBean.selectedCategory} "' và 'itemValue =" # {category.id} "', có vẻ khó hiểu. Tôi nghĩ rằng đó là một thực hành tốt để sử dụng một công cụ chuyển đổi trong trường hợp này. –

+0

Tnx, tôi đang sử dụng công cụ chuyển đổi, đã có mã an toàn tạm thời – nikagra

Các vấn đề liên quan