2010-05-13 18 views
25

Vì vậy, chúng ta có một f: sự kiện:JSF f: event preRenderView được kích hoạt bởi f: ajax calls và partial renders, cái gì khác?

<f:metadata> 
    <f:event type="preRenderView" listener="#{dashboardBacking.loadProjectListFromDB}"/> 
    </f:metadata> 

nào được kích hoạt như mong muốn trên tải trang ban đầu (render).

Tuy nhiên sự kiện preRenderView này cũng được kích hoạt bởi một phần trang ajax hiển thị, sẽ hiển thị lại nhóm h: panelgroup với id projectListing, như dưới đây.

<h:commandButton action="#{mrBean.addProject}" value="Create Project" 
            title="Start a new project"> 
    <f:ajax render="projectListing" /> 
</h:commandButton> 

Tôi chỉ muốn bảng điều khiểnBacking.loadProjectListFromDB được gọi để hiển thị trang ban đầu, nhưng không phải khi có phần hiển thị ajax. Có sự kiện hoặc phương pháp phù hợp hơn tôi có thể sử dụng không?

+0

Xem câu trả lời của Kawu: https://stackoverflow.com/a/10363027/1599699 '' là một cách tuyệt vời để thực hiện việc này. – Andrew

Trả lời

11

Một tùy chọn khác là đặt chức năng preRenderView của bạn vào phương thức @PostConstruct của một hạt được quản lý ViewScoped. Logic này sẽ được thực hiện khi bean được khởi tạo, và bạn duy trì cùng một cá thể của bean cho tất cả các yêu cầu ajax của bạn cho đến khi bạn thay đổi các khung nhìn.

+0

Cảm ơn Brian, đây đều là những gợi ý tốt. Tôi sẽ điều tra cả hai con đường ngày hôm nay. – Andrew

1

Bạn có thể thử gắn trình xử lý sự kiện preRenderView vào một thành phần riêng lẻ, thay vì trang. Chọn một thành phần không được trả lại trong một yêu cầu Ajax.

7

Một khả năng khác là kiểm tra xem yêu cầu có phải là yêu cầu ajax hay không trong phương thức preRenderView. Bạn cũng có thể thực hiện tải có điều kiện xem xét các yếu tố khác chẳng hạn như nếu yêu cầu là GET hay không và nếu xác thực không thành công hay không (xem thông số xác thực tham số có thể thất bại trên trang GET).

boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET") ? true : false; 
boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest(); 
boolean validationFailed = fc.isValidationFailed(); 
0

Một vấn đề nhỏ là các thông số quan điểm chưa được thiết lập khi các phương pháp được gọi là @PostConstruct vì vậy tôi đã phải nhận được chúng một cách rõ ràng:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("theParam"); 
31

Tôi có nhu cầu tương tự cách đây không quá lâu . Tôi đã sử dụng một cái gì đó được đề xuất bởi BalusC.

Có một phương thức trong lớp FacesContext cho phép bạn biết nếu bạn đang làm việc với một yêu cầu thổi đầy đủ hoặc một phần chế biến của một số loại:

FacesContext.getCurrentInstance().isPostback() 

Bằng cách này bạn vẫn có thể sử dụng kỹ thuật preRenderView và kiểm tra xem đó có phải là postback trong trình nghe không. Tôi thấy rằng đặc biệt hữu ích vì tôi cần một bean phiên vì người dùng phải điều hướng đến một trang khác và quay lại. Nếu tôi sử dụng các hạt cà phê có khung nhìn (như đề xuất ở trên bởi Brian), tôi sẽ mất thông tin tôi đã có trước khi điều hướng đi.

2

Các "new-age" cách xử lý này được mô tả ở đây:

http://www.coderanch.com/t/509746/JSF/java/duplicate-call-preRenderView-event#2634752

+0

Như bạn có thể thấy, OP có [đề xuất] (https://stackoverflow.com/review/suggested-edits/17618006) giải thích mở rộng. Làm thế nào mà nhìn? Chúng tôi thường nói: Liên kết đến giải pháp được hoan nghênh, nhưng hãy đảm bảo câu trả lời của bạn hữu ích khi không có nó: [thêm ngữ cảnh xung quanh liên kết] (https://meta.stackexchange.com/a/8259) để người dùng đồng nghiệp của bạn sẽ có một số ý tưởng nó là gì và tại sao nó ở đó, sau đó trích dẫn phần có liên quan nhất của trang bạn đang liên kết đến trong trường hợp trang đích không có sẵn. [Câu trả lời có nhiều hơn một liên kết có thể bị xóa] (https://stackoverflow.com/help/deleted-answers). –

0

cập nhật: trên thực tế, tôi đã kết thúc làm điều @PostConstruct, nó sạch hơn nhiều.

Tôi đã có chính xác cùng một vấn đề ngày hôm nay với bean sao lưu phiên. Cụ thể là, tôi đã đăng ký một phương thức lắng nghe sự kiện trên bean sao lưu phiên đã được đăng ký với preRenderView. Nhưng tôi thấy rằng nó cũng được kích hoạt trên một số thao tác phân loại Ajax trên một thành phần DataFaces 3 dataTable.Vì vậy, những gì tôi đã kết thúc là sử dụng biến boolean instance trên bean sao lưu phiên để đảm bảo phần thân của phương thức event-listener chỉ thực hiện lần đầu tiên (boolean hoạt động như một cờ). Tôi chắc chắn rằng nó khá ngây thơ và có thể bị hỏng trên một số trường hợp vì vậy tôi sẽ được quan tâm để biết tại sao và cách tiếp cận này đơn giản có thể thất bại.

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