Могу ли я обновить компонент JSF из метода поддержки bean JSF-поддержки?

Есть ли способ заставить JSF Backing bean вызвать обновление компонента на странице? Я не хочу использовать компонент ajax с атрибутом обновления для обновления компонента на странице. Мне нужно вызвать обновление из JSF-поддержки bean. Обратите внимание, что обновление на странице может произойти после завершения этого метода или до его завершения. Я использую PrimeFaces, если есть решение, которое можно использовать при использовании PrimeFaces.

Ответы

Ответ 1

Используя стандартный JSF API, добавьте идентификатор клиента в PartialViewContext#getRenderIds().

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

Используя специфический API PrimeFaces, используйте RequestContext#update().

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

Начиная с PrimeFaces 6.2, RequestContext#update() устарела, вместо этого используйте PrimeFaces::Ajax#update.

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

Если вы используете библиотеку утилит JSF OmniFaces, используйте Ajax#update().

Ajax.update("foo:bar");

Независимо от способа, обратите внимание, что эти идентификаторы клиента должны представлять абсолютные идентификаторы клиента, которые не имеют префикса с NamingContainer разделителем NamingContainer как вы делали бы со стороны представления.

Ответ 2

Я также попытался обновить компонент из поддержки jsf bean/class

После манипулирования компонентом пользовательского интерфейса вам необходимо выполнить следующие действия:

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

Важно использовать clientId вместо (server-side) componentId!!

Ответ 3

RequestContext устарел от Primefaces 6.2. Из этой версии используйте следующее:

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

И чтобы выполнить javascript из бэкана, используйте этот способ:

PrimeFaces.current().executeScript(jsCommand);

Ссылка: