2012-05-08 16 views
7

Có nên sử dụng immediate="true" khi xử lý một thành phần AJAXified JSF 2.0 không?Nên ngay lập tức = "true" không bao giờ được sử dụng khi giao dịch với một thành phần AJAXified JSF 2.0?

Ví dụ có thể là:

Nếu tôi muốn thực hiện một "Hủy" nút trên JSF 2.0 trang mà nếu người dùng nhấn "Cancel", không có kiểm chứng thực nên chạy, nên tôi đặt immediate="true" trên thành phần nếu nó là một thành phần ajaxified hoặc nên xác định rằng không có thành phần trên biểu mẫu nên được xử lý? Nếu vậy, cách nào để thực hiện chức năng này bằng cách sử dụng các tính năng AJAXified của thành phần chứ không phải là "cách cũ" khi sử dụng immediate="true"?

Trả lời

10

Thật vậy, mục đích của việc sử dụng immediate="true" vào một nút hủy bỏ đã trở thành vô dụng kể từ <f:ajax> mà bạn chỉ có thể thiết lập để execute="@this" (đó là mặc định đã được) để bỏ qua chế biến của tất cả các thành phần đầu vào trong các hình thức tương tự.

Bạn chỉ có thể gặp sự cố khi biểu mẫu đã được gửi trước nhưng không thành công do lỗi chuyển đổi/xác thực. Nếu bạn nhấn nút hủy bởi ajax và hiển thị biểu mẫu sau đó, các đầu vào vẫn được đánh dấu là không hợp lệ và bất kỳ thay đổi nào trong giá trị mô hình không được phản ánh (có thể bạn đang thực hiện entity = new Entity(); hoặc một cái gì đó trong phương pháp hủy hành động để xóa cũ giá trị của biểu mẫu). Sự cố này không xảy ra khi sử dụng yêu cầu đồng bộ (không phải ajax) với immediate="true". Vấn đề này thực sự không liên quan gì đến immediate="true", nhưng với vòng đời JSF của các yêu cầu ajax. Về cơ bản, bạn cần đặt lại trạng thái không hợp lệ của các thành phần đầu vào có liên quan bằng cách gọi EditableValueHolder#resetValue() trên các thành phần không được bao gồm trong ajax execute, nhưng được bao gồm trong ajax render. OmniFacesResetInputAjaxActionListener cho mục đích chính xác này.

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