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

100

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

Лучшие практики
источник
Может вызвать ошибку проверки: stackoverflow.com/a/14401741/1599699
Эндрю

Ответы:

183

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

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

Используя специальный API PrimeFaces, используйте PrimeFaces.Ajax#update().

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

Или, если вы еще не пользуетесь PrimeFaces 6.2+, используйте RequestContext#update().

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

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

Ajax.update("foo:bar");

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

BalusC
источник
6
Похоже, что я не могу заставить это работать во время фазы ответа рендеринга (где, к сожалению, я вынужден разместить этот код). Если я помещаю в Invoke Application или на более ранние этапы, все работает нормально. Есть ли обходные пути для нахождения в фазе ответа отрисовки?
BestPractices 06
8
Нет, уже поздно. Переместите задание, чтобы вызвать фазу действия или перед фазой отклика рендеринга. Вызов метода с помощью <f:ajax listener>or<f:event type="preRenderView" listener>
BalusC
Есть идеи, как это сделать с JSF 1.2? Я могу задать новый вопрос, если ответ будет слишком длинным / сложным.
RinaldoPJr 06
@RinaldoPJr: JSF 1.2 не имеет понятия о <f:ajax>. Это введено с JSF 2.0. Вам придется прибегнуть к средствам, специфичным для библиотеки компонентов JSF 1.2.
BalusC 07
@DanielK: Понятия не имею. Я не занимаюсь Тринидадом. Просто используйте стандартный подход JSF API, если вы все еще не можете понять, как работает Тринидад.
BalusC
9

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

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

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

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

Фритьоф Шефер
источник
7

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

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

А для выполнения javascript из backbean используйте такой способ:

PrimeFaces.current().executeScript(jsCommand);

Ссылка:

ℛɑƒæĿᴿᴹᴿ
источник
1

Все возможно, только если будет достаточно времени на исследования :)

То, что мне нужно делать, - это как иметь людей, которых я перебираю в пользовательский интерфейс: повторять и отображать имена и другие поля во входных данных. Но одно из полей было singleSelect - A, и в зависимости от его значения обновлялось другое input - B. даже ui: repeat, у меня нет идентификатора, который я ввел, и он появился в дереве DOM

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

Тогда идентификаторы в html были примерно такими:

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

Тогда в представлении у меня есть один метод, например:

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

И его реализация была в bean-компоненте, например:

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

Таким образом, я обновил элемент из bean-компонента без проблем. PF версии 6.2

Удачи и удачного кодирования :)

panayot_kulchev_bg
источник
Если у вас есть событие изменения ajax personType, то передача человека и индекса в прослушиватель ajax излишняя. Вы можете получить как идентификатор, так и значение из события. Но ваше решение может быть необходимым для вашего конкретного случая использования, но, поскольку нет полного примера (в минимально воспроизводимом вкусе примера ), трудно сказать.
Kukeltje