Tôi có thể cập nhật một thành phần JSF từ một phương thức bean sao lưu JSF không?


100

Có cách nào để có một hạt sao lưu JSF gây ra bản cập nhật của một thành phần trên trang không? Tôi không muốn sử dụng thành phần ajax có thuộc tính cập nhật để cập nhật một thành phần trên trang. Tôi cần kích hoạt bản cập nhật từ bên trong một phương thức bean sao lưu JSF. Lưu ý rằng cập nhật trên trang có thể xảy ra sau khi phương pháp này hoàn thành hoặc trước khi hoàn thành. Tôi đang sử dụng PrimeFaces, nếu có một giải pháp có thể có từ việc sử dụng PrimeFaces.


Có thể kích hoạt lỗi xác thực: stackoverflow.com/a/14401741/1599699
Andrew

Câu trả lời:


183

Sử dụng API JSF tiêu chuẩn, thêm ID ứng dụng khách vào PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

Sử dụng API cụ thể của PrimeFaces, hãy sử dụng PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

Hoặc nếu bạn chưa sử dụng PrimeFaces 6.2+, hãy sử dụng RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

Nếu bạn tình cờ sử dụng OmniFaces thư viện tiện ích JSF , hãy sử dụng Ajax#update().

Ajax.update("foo:bar");

Bất kể theo cách nào, hãy lưu ý rằng những ID khách hàng đó phải đại diện cho những ID khách hàng tuyệt đối không có tiền tố là NamingContainerký tự phân tách như cách bạn làm từ phía chế độ xem trên.


6
Có vẻ như tôi không thể làm cho điều này hoạt động trong giai đoạn Render Response (thật không may là nơi tôi buộc phải đặt mã này). Nếu tôi đặt trong Đơn xin mời hoặc các giai đoạn trước đó, mọi thứ hoạt động tốt. Bất kỳ giải pháp thay thế nào cho việc đang trong giai đoạn Phản hồi kết xuất?
BestPractices

8
Không, đã quá muộn. Di chuyển công việc để gọi giai đoạn hành động hoặc trước giai đoạn phản hồi kết xuất. Gọi các phương pháp mà theo <f:ajax listener>hay<f:event type="preRenderView" listener>
BalusC

Bất kỳ ý tưởng về cách làm điều đó với JSF 1.2? Tôi có thể hỏi một câu hỏi mới nếu câu trả lời quá dài / phức tạp.
RinaldoPJr

@RinaldoPJr: JSF 1.2 không có khái niệm <f:ajax>. Điều này được giới thiệu kể từ JSF 2.0. Bạn cần phải sử dụng các cơ sở cụ thể của thư viện thành phần JSF 1.2.
BalusC

@DanielK: Không ý kiến. Tôi không làm Trinidad. Chỉ cần sử dụng phương pháp tiếp cận API JSF tiêu chuẩn nếu bạn vẫn không thể tìm ra cách Trinidad.
BalusC

9

Tôi cũng đã cố gắng cập nhật một thành phần từ một bean / class jsf sao lưu

Bạn cần thực hiện những việc sau sau khi thao tác với thành phần UI:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

Điều quan trọng là sử dụng clientId thay vì componentId (phía máy chủ) !!


7

Các RequestContextđang bị phản đối từ Primefaces 6.2 . Từ phiên bản này sử dụng như sau:

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

Và để thực thi javascript từ backbean, hãy sử dụng theo cách này:

PrimeFaces.current().executeScript(jsCommand);

Tài liệu tham khảo:


1

Mọi thứ chỉ có thể nếu có đủ thời gian để nghiên cứu :)

Những gì tôi phải làm giống như có những người mà tôi lặp lại thành một ui: lặp lại và hiển thị tên và các trường khác trong đầu vào. Nhưng một trong các trường là SingleSelect - A và tùy thuộc vào nó giá trị cập nhật đầu vào khác - B. Even ui: repeat không có id tôi đặt và nó xuất hiện trong cây DOM

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

Hơn các id trong html là một cái gì đó giống như:

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

Ngoài chế độ xem, tôi có một phương pháp như:

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

Và việc thực hiện nó trong bean như:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

Vì vậy, bằng cách này tôi đã cập nhật phần tử từ bean mà không có vấn đề gì. Phiên bản PF 6.2

Chúc may mắn và viết mã vui vẻ :)


Nếu bạn có sự kiện thay đổi ajax trên personType, thì việc chuyển cả người và chỉ mục cho trình nghe ajax là không cần thiết. Bạn có thể lấy cả id và giá trị từ sự kiện. Nhưng giải pháp của bạn có thể là một giải pháp cần thiết cho usecase cụ thể của bạn, nhưng vì không có ví dụ đầy đủ (trong hương vị ví dụ có thể tái tạo tối thiểu ) nên rất khó để nói.
Kukeltje
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.