2012-04-23 3 views
8

Khi tôi chỉ định thuộc tính process của thẻ p:ajax, trình nghe không được thực thi. Nếu tôi bỏ qua thuộc tính process thì người nghe sẽ được gọi như mong đợi.Trình lắng nghe Ajax của PrimeFaces không được thực hiện khi thuộc tính quy trình được chỉ định cho một thành phần khác

Dưới đây là đoạn xem:

<p:messages id="messages" /> 
<h:inputText id="inputToProcess" value="#{controller.inputToProcess}" /> 
<p:selectBooleanCheckbox id="testCheckbox" > 
    <p:ajax event="change" process="inputToProcess" 
    update="messages @this inputToUpdate" 
    listener="#{controller.processChecked}" /> 
</p:selectBooleanCheckbox> 
<h:inputText id="inputToUpdate" value="#{controller.inputToUpdate}" /> 

Và Bộ điều khiển:

@javax.faces.bean.ManagedBean 
@javax.faces.bean.ViewScoped 
public class Controller implements Serializable { 
    private String inputToProcess; 
    private String inputToUpdate; 
    //getters and setters 

    public void processChecked(javax.faces.AjaxBehaviorEvent e) { 
    // doing some stuff here 
    } 
} 

I kèm theo một phaseListener đến một cái nhìn với ANY_PHASEPhaseId, và đây là những gì tôi quan sát.

Khi tôi chỉ định thuộc tính process, giá trị của đầu vào inputToProcess được đặt thành công cho bộ điều khiển trong giai đoạn Mô hình cập nhật (không xảy ra ngoại lệ). Sau đó, các giai đoạn Invoke ApplicationRender Response được thực thi, nhưng không có người nghe nào được gọi. Một điều tôi nhận thấy là hộp kiểm không được đặt ở cuối. Tuy nhiên, không có lỗi chuyển đổi hoặc xác thực, bởi vì như tôi đã nói các giai đoạn Update ModelInvoke Application được thực thi.

Nếu tôi bỏ qua thuộc tính process, dưới đây là những gì tôi thấy: người nghe thường được gọi trong giai đoạn Invoke Application (vì immediate là false theo mặc định), và sau đó `Render Response được thực thi. Hộp kiểm được đặt thành công.

Có giải thích nào cho loại hành vi này không?

+0

Nếu bạn thêm '@ this' vào' process' thì sao? Nếu bạn sử dụng hộp kiểm JSF tiêu chuẩn và các thành phần ajax thay vì các thành phần PrimeFaces thì sao? – BalusC

+0

@BalusC Tôi mệt mỏi đếm số lần bạn đã giúp tôi. Cảm ơn một tấn! Thêm '@ this' vào' process' đã làm việc cho tôi. Bạn có thể giải thích tại sao? Tôi nghĩ rằng 'listener' nên được kích hoạt không có vấn đề, cho dù' @ this' được xác định trong 'process' hay không. Đây có phải là một vấn đề không? Vấn đề với hộp kiểm JSF tiêu chuẩn và các thành phần ajax, là người nghe được gọi trong giai đoạn 'Process Validations', nhưng tôi cần phải cập nhật mô hình đầu tiên! Anywho, đăng bài này như một câu trả lời, tôi sẽ sẵn sàng chấp nhận nó. – jFrenetic

+0

Sự cố đã được thêm tại: https://github.com/primefaces/primefaces/issues/509, nhưng họ không muốn sửa lỗi đó. Vui lòng vào và bình luận và bỏ phiếu cho nó. – GreenieMeanie

Trả lời

15

Nó sẽ hoạt động tốt ngay từ cái nhìn đầu tiên. Ít nhất, nó hoạt động tốt như vậy khi sử dụng các thành phần JSF chuẩn. Tôi muốn đặt cược nó là một lỗi hoặc "tính năng" của PrimeFaces rằng nó không xử lý các hành động khi các thành phần hành động không được bao gồm trong process. Thêm @this vào process sẽ giải quyết vấn đề. Xem xét việc đăng một báo cáo vấn đề lên PrimeFaces guys.

Hơn nữa, tôi muốn sử dụng event="valueChange" hoặc event="click" thay vì event="change" hoặc chỉ loại bỏ các event hoàn toàn, nó mặc định là giá trị đúng rồi (valueChange mà sẽ làm cho onclick trong hộp kiểm và nút radio thành phần). Sự kiện change hoạt động khác nhau trong MSIE cho hộp kiểm và nút tắt. Nó chỉ được kích hoạt vào lần nhấp thứ hai và ra. Bạn không muốn phụ thuộc vào trình duyệt.


Theo nhận xét của bạn:

Vấn đề với hộp kiểm và ajax thành phần JSF chuẩn, là người nghe được gọi trong quá trình validations giai đoạn, nhưng tôi cần phải cập nhật mô hình đầu tiên!

Điều này không đúng. Có thể bạn đang sử dụng valueChangeListener thay vì <f:ajax listener> hoặc gây nhầm lẫn với người khác. <f:ajax listener> luôn được gọi trong giai đoạn gọi hành động.

+0

Tuyệt vời! Bạn đã đúng, tôi đã sử dụng 'valueChangeListener'. Một câu hỏi cuối cùng. Với 'f: ajax', tôi nên chỉ định sự kiện nào? Hoặc nó mặc định với giá trị đúng cũng như với 'p: ajax'? – jFrenetic

+2

Vâng, đúng vậy. Giá trị mặc định luôn là 'event =" valueChange "' đối với 'UIInput' components và' event = "action" 'cho các thành phần' UICommand'. Trên các thành phần 'UIInput', nó sẽ dịch thành' thay đổi' cho các phần tử HTML input/select/textarea và thành phần 'click' cho các phần tử hộp thư/HTML. – BalusC

+1

Mặc dù 'process' mặc định là' @ this' như được mô tả trong tài liệu Primefaces, '@ this' đáng ngạc nhiên không được xử lý nếu bạn có các id thành phần khác trong' process'. –