JSF Ajax Link выполняет частичный рендеринг Ajax перед действием ссылки - PullRequest
5 голосов
/ 11 марта 2012

У меня есть следующее на странице JSF:

<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
    <f:ajax event="action" render=":form:table" />
</h:commandLink>

Рендеринг работает отлично, хотя он рендерит компонент до действия .(Я знаю это по журналам)

Можно ли как-то визуализировать компоненты после выполнения функции действия на сервере?

Любая помощь будет принята с благодарностью

Обновление 1

Я удалил атрибут действия и добавил слушатель к тегу, хотя, к сожалению, это не помогает, метод по-прежнему вызывается после визуализации дерева компонентов.

Ответы [ 3 ]

1 голос
/ 11 марта 2012
<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
    <f:ajax event="action" render=":form:table" />
</h:commandLink>

Рендеринг работает отлично, хотя он выполняет рендеринг компонента перед выполнением действия. (Я знаю это по логам)

Это не правда. Вы, должно быть, неправильно интерпретируете регистрацию. Возможно, вы поместили инструкцию log в метод получения значения таблицы, ошибочно предполагая, что only вызывается во время ответа рендеринга. Таким образом, это не так. Получатель вызывается столько раз, сколько вычисляется выражение EL, ссылающееся на свойство. Это может произойти в другой фазе до и после фазы действия вызова. Поскольку у вас есть ссылка команды внутри таблицы данных, метод получения значения таблицы также будет вызываться на этапе применения значений запроса, чтобы найти строку, связанную с этой ссылкой.

Передайте FacesContext#getCurrentPhaseId() вместе с журналом, чтобы узнать, на каком этапе вызывается метод получения. Также обратите внимание, что выполнение бизнес-работы (например, вызов базы данных и т. Д.) Внутри метода получения управляемого бина - плохая идея.

Смотри также:

0 голосов
/ 15 марта 2016

поздно, но у меня была такая же проблема. Ajax рендерится до того, как моя логика JSF завершена. Мое решение? Ну, я добавил диалог подтверждения. Я знаю, что это не техническое решение, но эй, оно работает. Как только пользователь нажимает «ОК» в диалоговом окне (это занимает около секунды, в этот раз логика должна быть выполнена), компонент должен быть визуализирован. Удачи, надеюсь, это поможет.

До изменений:

<h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
  <f:ajax
      execute="components"
      render="table"
  />
</h:commandButton>

После изменений:

<h:commandButton onclick="javascriptCofirm();" action="#{bean.buisnessLogic(param1, param2)}">
  <f:ajax
      execute="components"
  />
</h:commandButton>
<h:commandButton id="button" style="display: none">
  <f:ajax
     render="table"
  />
</h:commandButton>

JavaScript:

function javascriptConfirm() {
   bootbox.alert("Se agrego la accion con exito.", function () {
      var boton = document.getElementById("button");
      boton.click();
   });
   e.preventdefault();
   return false;
}

Что я сделал:

Итак, до внесения изменений. Мой commandButton будет отображать таблицу до добавления регистров. Например, я добавил бы строку 2, и она не показала бы изменения, пока страница не была обновлена ​​или строка 3 была добавлена. Я провел небольшое исследование и пришел к выводу, что jsf переводит тег ajax в javascript, а javascript непосредственно выполняет код, не дожидаясь завершения действия.

Решение:

Итак, теперь я удаляю атрибут рендеринга из ajax и создаю другую commandButton, а в новой commandButton я добавляю рендер. Метод javascriptConfirm вызывает кнопку и «щелкает по ней». Это отображает страницу, но к тому времени, когда они подтверждают, что логика бизнеса завершена. Так что да. Это, вероятно, сбивает с толку. Что бы вы ни комментировали, я постараюсь ответить как можно быстрее (возможно, не так быстро).

0 голосов
/ 11 марта 2012

Вы можете использовать listener из f:ajax для выполнения вашей логики и передать row.id одним из следующих способов (удалить action="#{manager.removeEntity(row.id)}")

Передать параметрпри вызове ajax 1

Передать параметр при вызове ajax 1

...