2011-06-15 42 views
13

Tôi đã hỏi this câu hỏi và mặc dù câu trả lời trực tiếp thỏa mãn nhu cầu của tôi Tôi bị bỏ lại với cảm giác rằng phải có giải pháp đơn giản hơn cho vấn đề cụ thể này.Làm cách nào để triển khai danh sách động với Thành phần hỗn hợp JSF 2.0?

Tôi muốn có một thành phần hỗn hợp, chấp nhận một danh sách các mục (Các loại mặt hàng thoả thuận để các thành viên có thể được sử dụng một cách tự do trong thành phần composite)

CC (thành phần composite) hiển thị danh sách các mục và cho phép cộng và trừ các mục.

Tôi muốn thực hiện điều này một cách đơn giản và hiệu quả nhất.

Để minh họa cho vấn đề này, một ví dụ:

enter image description here

Định nghĩa nên khá đơn giản (trừ khi tất nhiên, nó không :-)):

<special:dynamicFieldList value="#{bean.fieldList} /> 

Các hình thức trừu tượng nhất của một đối tượng Field sẽ là:

public class Field{ 
String uuid; 
String value; 
} 

Tôi đoán vậy. Bạn sẽ thực hiện điều này một cách đơn giản như thế nào?

Cảm ơn!

Trả lời

24

Tôi muốn sử dụng <h:dataTable> trong thành phần hỗn hợp có độ ủng hộ UIComponent mà bạn có thể liên kết với thuộc tính componentType của <composite:interface>. Trong sự ủng hộ UIComponent, bạn có thể duy trì DataModel và xác định các hành động.

dynamicFieldList.xhtml

<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:cc="http://java.sun.com/jsf/composite" 
> 
    <cc:interface componentType="dynamicFieldList"> 
     <cc:attribute name="value" type="java.util.List" required="true" /> 
    </cc:interface> 
    <cc:implementation> 
     <h:dataTable id="table" binding="#{cc.table}" value="#{cc.attrs.value}" var="field"> 
      <h:column><h:outputLabel value="#{field.label}" /></h:column> 
      <h:column><h:inputText value="#{field.value}" /></h:column> 
      <h:column><h:commandButton value="remove" action="#{cc.remove}" /></h:column> 
     </h:dataTable> 
     <h:commandButton value="add" action="#{cc.add}" /> 
    </cc:implementation> 
</ui:composition> 

(các <h:inputText> thể nếu cần thiết có thành phần lĩnh vực hợp của bạn)

com.example.DynamicFieldList

@FacesComponent(value="dynamicFieldList") // To be specified in componentType attribute. 
@SuppressWarnings({"rawtypes", "unchecked"}) // We don't care about the actual model item type anyway. 
public class DynamicFieldList extends UINamingContainer { 

    private UIData table; 

    public void add() { 
     ((List) getAttributes().get("value")).add(new Field("somelabel")); 
    } 

    public void remove() { 
     ((List) getAttributes().get("value")).remove(table.getRowData()); 
    } 

    public UIData getTable() { 
     return table; 
    } 

    public void setTable(UIData table) { 
     this.table = table; 
    } 

} 

Sử dụng nó như sau:

<h:form> 
    <my:dynamicFieldList value="#{bean.fields}" /> 
</h:form> 

chỉ này

@ManagedBean 
@ViewScoped 
public class Bean implements Serializable { 

    private List<Field> fields; 

    public Bean() { 
     fields = new ArrayList<>(); 
    } 

    public List<Field> getFields() { 
     return fields; 
    } 

} 

public class Field implements Serializable { 

    private String label; 
    private String value; 

    public Field() { 
     // 
    } 

    public Field(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 
+0

@BalusC Tnx. Nhưng làm thế nào để đóng gói nó thành một thành phần tổng hợp? Tôi có phải chuyển các phương thức "remove" và "add" thành các thuộc tính không? Tôi đoán điều đó có thể chấp nhận được .. – Ben

+1

Tôi đã cập nhật câu trả lời. Điểm mấu chốt là sử dụng "sự ủng hộ' UIComponent' "nơi bạn xác định các hành động. – BalusC

+3

Đẹp nhất! :) Tôi tự hỏi về hình thức nhúng trong thành phần tổng hợp. Nó thuận tiện như được đưa ra, nhưng cũng có nghĩa là thành phần đặc biệt này không thể được sử dụng bên trong một biểu mẫu khác. –

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