2012-01-04 32 views
5

Tôi đang sử dụng thành phần thủ thuật Primefaces. Trên một tab, tôi tự động tạo các hộp đầu vào dựa trên đầu vào của các tab trước (loại người dùng). Các nhãn văn bản đầu vào có nguồn gốc từ một danh sách. Trong bean sao lưu của tôi, tôi có một bản đồ chứa các nhãn đầu vào như các đầu vào khóa và đầu vào làm giá trị.Làm cách nào để ràng buộc giá trị hộp nhập vào giá trị bản đồ trong thuộc tính bean sao lưu khi sử dụng thuật sĩ

Nhấp vào hôm sau, tôi muốn bản đồ (giá trị) được cập nhật với các đầu vào sử dụng (tương ứng với phím)

<c:forEach items="#{gdsiGeodataBean.actionCommand.fields}" var="reqs"> 
    <h:outputLabel for="#{reqs.name}" value="#{reqs.name}:* " /> 
    <pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 
</c:forEach> 

đậu ủng hộ của tôi:

private List<RequiredParam> fields; // +getter (no setter required) 
private Map<String, String> values; // +getter (no setter required) 

public CommandAction(String actionName, String actionParams, String context) { 
    this.actionName = actionName; 
    this.actionParams = actionParams; 
    this.contextName = context; 

    //Set up parameters 
    getRequiredParams(); 
    getOptionalParams(); 
    fields = getFields(); 
    values = new HashMap<String, String>(); 
} 

Về cơ bản những gì tôi muốn cho các giá trị bản đồ được cập nhật với đầu vào của người dùng từ các hộp văn bản.

+0

Như bạn có thể thấy tôi đã làm theo ví dụ này http://stackoverflow.com/questions/7010256/how-to-dynamically-build-a-back-bean-edit-form – algone

+0

Thử thêm sự kiện FlowListener trên bean được quản lý của bạn và xác minh ở đó nếu các giá trị trong bản đồ của bạn đang được cập nhật ở phía máy chủ: 'flowListener =" # {managedBean.onFlowListener} ' Nếu điều này không xảy ra, hãy xác minh rằng bạn không nhận được bất kỳ trường hợp ngoại lệ hoặc xác thực nào lỗi trong giai đoạn xác nhận của postback –

+0

@maple_shaft Tôi đã có điều đó trong quan điểm của mình. algone

Trả lời

12

Cách tiếp cận của bạn để ràng buộc giá trị đầu vào vào bản đồ không hoàn toàn chính xác.

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}" required="true" requiredMessage="Input is required."/> 

Bạn đang xác định một phím đồ cố định thay vì một chìa khóa bản đồ năng động dựa trên hiện lặp #{reqs}. Bằng cách này, tất cả các giá trị đã gửi sẽ kết thúc bằng một và cùng một khóa bản đồ cố định "reqs.name", theo đó mỗi giá trị ghi đè nhau để bạn chỉ nhận được giá trị của trường cuối cùng trong bản đồ.

Bạn cần phải loại bỏ các dấu ngoặc đơn đó để biến nó thành một khóa thực sự năng động.

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values[reqs.name]}" required="true" requiredMessage="Input is required."/> 

Không liên quan cho câu hỏi cụ thể, mặc dù phương pháp này sẽ làm việc khi được sử dụng như nó vốn có trong câu hỏi của bạn, <c:forEach> sẽ thất bại trong một số trường hợp. Ví dụ. khi được sử dụng bên trong một thành phần tổng hợp hoặc một thành phần JSF lặp lại. Thay vào đó, hãy sử dụng <ui:repeat>. Xem thêm JSTL in JSF2 Facelets... makes sense?

+1

'actionCommand.values' có yêu cầu getter và setter để thực sự là thuộc tính bị ràng buộc không? OP không thể hiện điều này trong mã của anh ấy, nhưng tôi hỏi vì tôi thực sự không biết, tôi chưa bao giờ sử dụng thành phần 'c: forEach' trước đây. –

+2

@maple_shaft: chỉ cần getter {getValues ​​() 'getter. Một setter là không cần thiết trên bản đồ/danh sách. JSF EL sẽ đặt giá trị trên bản đồ/danh sách thu được bằng khóa/chỉ mục EL đã cho. Giống như vậy: 'gdsiGeodataBean.getActionCommand(). GetValues ​​(). Put (reqs.getName(), newValue)'. Điều này là bất kể nó nằm trong '', '', v.v. – BalusC

+0

Cảm ơn bạn đã giải thích, điều đó có ý nghĩa ngay bây giờ! –

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