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


100

Чи є спосіб, щоб перетворювач JSF Backing викликає оновлення компонента на сторінці? Я не хочу використовувати компонент ajax з атрибутом update для оновлення компонента на сторінці. Мені потрібно запустити оновлення в рамках методу резервного боба JSF. Зауважте, оновлення на сторінці може відбутися після завершення цього методу або до його завершення. Я використовую PrimeFaces, якщо є рішення, яке може бути можливим від використання PrimeFaces.


Може викликати помилку перевірки: stackoverflow.com/a/14401741/1599699
Ендрю

Відповіді:


183

За допомогою стандартного API JSF додайте ідентифікатор клієнта до 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символом роздільника, як, як це було б зроблено з боку перегляду.


6
Схоже, я не можу змусити це працювати під час фази відповіді на відтворення (на жаль, саме там я змушений розмістити цей код). Якщо я розміщую в програмі Invoke Application або на попередніх етапах, все добре працює. Будь-які шляхи вирішення питання про те, що перебуваєте у фазі відповіді на надання?
BestPractices

8
Ні, вже пізно. Перемістіть завдання, щоб викликати фазу дії або перед фазою надання відповіді. Виклик методу <f:ajax listener>або<f:event type="preRenderView" listener>
BalusC

Будь-яка ідея, як це зробити з JSF 1.2? Я можу задати нове запитання, якщо відповідь занадто довгий / складний.
RinaldoPJr

@RinaldoPJr: JSF 1.2 не має поняття <f:ajax>. Це запроваджено з JSF 2.0. Вам потрібно вдатися до спеціальних засобів бібліотеки компонентів JSF 1.2.
BalusC

@DanielK: Не маю ідеї. Я не займаюся Тринідадом. Просто використовуйте стандартний підхід API JSF, якщо ви все ще не можете з'ясувати шлях Тринідаду.
BalusC

9

Я також спробував оновити компонент із файлу jsf backing / class

Після маніпулювання компонентом інтерфейсу потрібно зробити наступне:

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

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


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 і залежно від цього значення оновіть інший вхід - B. even ui: повторити не маю ідентифікатор, який я поставив, і він з’явився у дереві 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)}"/>

І його реалізація полягала у тому вигляді:

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

Тож таким чином я оновив елемент із квасолі без проблем. PF версія 6.2

Удачі та щасливого кодування :)


Якщо у вас відбулася подія зміни ajax на каналі personType, то передача як особи, так і індексу слухачеві ajax зайва. Ви можете отримати ідентифікатор, і значення з події. Але ваше рішення може бути потрібним для вашого конкретного використання, але оскільки не існує повного прикладу (з мінімально відтворюваним прикладним ароматом), важко сказати.
Kukeltje
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.