JSF instant = "true" для кнопки отмены не работает - PullRequest
5 голосов
/ 10 октября 2011

У меня есть страница с двумя вкладками, одна вкладка - список записей, щелчок по записи переключится на вкладку Редактировать, а на вкладке Редактировать есть кнопки Сохранить и Отменить.

Теперь я нажимаю на запись № 1, делаю некоторые изменения и нажимаю кнопку «Отмена». Конечно, я не хочу проверять форму, потому что она отменена, поэтому я установил immediate="true" на кнопку Отмена. Теперь вкладка редактирования закрыта, вернемся к списку записей. Затем я нажимаю на другую запись № 2, возникла проблема: во вкладке редактирования это все еще предыдущее содержимое записи № 1, а не запись № 2. Я проверил переменные в режиме отладки, задний компонент для формы редактирования был фактически заполнен записью # 2.

То есть, что-то сломалось после немедленной команды.

(все было хорошо до того, как я добавил валидацию и сразу же = "true".)

class FormBean {

    Record activeRecord;
    ...

    public void clickOnList() {
        activeRecord = loadRecord(clickIndex);
    }

    public void cancelForm() {
        activeRecord = null;
    }

}

page.xhtml:

<h:form id="main">
  ...
  <p:tab title="Edit" rendered="#{formBean.activeRecord != null}">
    ...
    <p:commandButton value="Cancel"
        actionListener="#{formBean.cancelForm}"
        update="main" async="true" immediate="true" />
  </p:tab>
</h:form>

1 Ответ

18 голосов
/ 10 октября 2011

immediate="true" плохо работает с запросами ajax в том же виде. Это сводится к тому, что представленные, но не проверенные значения все еще присутствуют во входных компонентах. Без ajax обычный синхронный запрос / ответ последующей отправки формы молча «решит» это. Но с AJAX этого не происходит. Переданные значения предыдущего ajax-запроса все еще находятся во входных компонентах. Когда UIInput#getSubmittedValue() не возвращает null, оно будет отображаться вместо этого, независимо от (измененного) значения модели.

По сути, когда вы хотите придерживаться ajax для кнопки отмены, вам нужно исключить обработки входных данных вместо того, чтобы полагаться на immediate="true" (что на самом деле является своего рода хаком). В стандартных терминах JSF <f:ajax> это можно сделать с помощью кнопки execute="@this" (которая на самом деле используется по умолчанию) вместо execute="@form". Кнопки PrimeFaces по умолчанию @form, поэтому вам нужно изменить это:

<p:commandButton value="Cancel"
    actionListener="#{formBean.cancelForm}"
    update="main" async="true" process="@this" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...