Câu hỏi Tôi có thể cập nhật thành phần JSF từ phương thức sao lưu JSF không?


Có cách nào để có một bean JSF Backing gây ra một bản cập nhật của một thành phần trên trang không? Tôi không tìm cách sử dụng thành phần ajax với thuộc tính cập nhật để cập nhật thành phần trên trang. Tôi cần kích hoạt cập nhật từ bên trong phương thức sao lưu JSF. Lưu ý rằng cập nhật trên trang có thể xảy ra sau khi phương thức này hoàn tất 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.


76
2017-07-06 15:22


gốc


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


Các câu trả lời:


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

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

Sử dụng API cụ thể của PrimeFaces, sử dụng RequestContext#update().

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

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

Ajax.update("foo:bar");

Bất kể cách nào, lưu ý rằng các ID khách hàng đó phải đại diện cho các ID khách hàng tuyệt đối không phải bắt đầu bằng NamingContainer ký tự phân cách như bạn sẽ làm từ phía bên trên.


140
2017-07-06 17:51



Nó xuất hiện như thể tôi không thể làm điều này để làm việc trong giai đoạn Render Response (mà, thật không may là nơi tôi buộc phải đặt mã này). Nếu tôi đặt trong ứng dụng Gọi hoặc giai đoạn trước đó, mọi thứ hoạt động tốt. Bất kỳ cách giải quyết nào trong giai đoạn Render Response? - BestPractices
Không, đã quá muộn. Di chuyển công việc để gọi pha hành động hoặc trước khi trả về pha phản hồi. Gọi phương thức bằng <f:ajax listener> hoặc là <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ể đặ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 về <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 đến các cơ sở cụ thể của thư viện thành phần JSF 1.2. - BalusC
@DanielK: Không có ý tưởng. 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 con đường Trinidad. - BalusC


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

Bạn cần phải làm như sau sau khi thao tác 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ủ) !!


6
2017-07-02 10:48





Các RequestContext Là không dùng nữa từ Primefaces 6.2. Từ phiên bản này, hãy sử dụng như sau:

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

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

PrimeFaces.current().executeScript(jsCommand);

Tài liệu tham khảo:


1
2018-06-07 19:28