Условно отображать компоненты с ajax условно, только если проверка проходит

Я использую JSF 2.2, и мне было интересно, есть ли способ отображать компоненты с помощью ajax условно, только если проверка проходит. Используя атрибут рендеринга ajax, компоненты будут отображаться независимо от прохождения проверки или нет. То, что мне нужно, это что-то вроде:

<f:ajax ... render="#{validationHasPassed ? 'foo' : ''}" />
...
<h:panelGroup id="foo">
          <!-- other components here -->
  </h:panelGroup>

Можно ли условно визуализировать компонент подобным образом? В моем случае я не хочу иметь атрибут rendered во фрагменте и устанавливать для него значение true или false, так как это делает фрагмент вообще не существующим в DOM, если проверка не удалась. У меня может быть определенный стиль css, например, в компонентах внутри panelGroup, который был получен через jQuery после некоторого взаимодействия со страницей, и я не хочу отображать раздел, если проверка не пройдена, чтобы он мог оставаться в своем текущем визуальном состоянии .


person Gabriel    schedule 30.05.2015    source источник


Ответы (1)


Вы можете использовать FacesContext#isValidationFailed(). Он вернет true, если проверка не удалась в текущем жизненном цикле JSF. Текущий экземпляр FacesContext доступен также в EL как #{facesContext}.

Просто проверьте его в атрибуте rendered и обновите его родительский компонент-заполнитель. Обратите внимание, что вы не можете условно отображать компонент, у которого сам по себе установлен атрибут rendered, поскольку в противном случае JavaScript не сможет найти и обновить его. Ваша теоретическая <f:ajax> попытка точно так же потерпела бы неудачу.

E.g.

<f:ajax ... render="foo-holder" />
...
<h:panelGroup id="foo-holder">
    <h:panelGroup id="foo" rendered="#{not facesContext.validationFailed}">
        Validation has not failed.
    </h:panelGroup>
</h:panelGroup>

При необходимости добавьте layout="block", чтобы сделать их <div> компонентами вместо <span>, в зависимости от окончательной разметки.

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

person BalusC    schedule 31.05.2015
comment
Спасибо за ваш ответ BalusC. Я должен был более четко объяснить, что именно я хочу сделать. Я отредактировал свой вопрос, чтобы уточнить его. - person Gabriel; 01.06.2015
comment
И я добавил еще несколько логических объяснений и фрагментов ответа, см. также ссылку в ответ. Что касается отредактированного вопроса, я еще больше улучшил редактирование. В будущем, пожалуйста, не меняйте вопрос таким образом, чтобы ответ стал полностью недействительным (в вашем конкретном случае я, казалось, только ответил, что вы уже давно знали, что выглядит действительно запутанным и глупым для будущих читателей). Если вам действительно нужно, вам лучше задать новый вопрос, иначе ответчик, скорее всего, просто удалит ответ и понизит вопрос. - person BalusC; 01.06.2015