Так что у меня возникла такая проблема с PrimeFaces (приведенный выше ответ не был достаточным на этот раз), и я также нашел решение.
Часть проблемы, я думаю, заключалась в том, что я использовал ui:include
рекурсивно. По какой-то причине PrimeFaces иррационально заставляла компоненты пользовательского интерфейса связываться с внутренними данными несинхронно; например, при нажатии кнопки «Добавить» в пользовательском интерфейсе будет создано новое значение, но затем данные для него будут удалены из значений для раздела ниже и т. д.
Объяснение? «[O] В объекте видимости, в форму добавлено скрытое поле для хранения данных обратной передачи [;], если это поле не включено в процесс, то компонент потеряет контекст». Эта конкретная проблема особенно характерна для ui:include
рекурсии. Решение (все относительно p:commandButton
или другого действующего компонента):
- Убедитесь, что
update
и process
указывают на компонент JSF, а не на обычный компонент HTML.
update
следующая область действия, если она нарушается (не синхронизируется с привязкой).
- Используйте
styleClass
для обновления (не например, PF ID или типа @this:@parent
), так что вместо PF используется jQuery, например: @(.fieldset-class)
.
process
любой объем обновляется. (Это необходимо для данных обратной передачи, чтобы Бин сохранял свой контекст для обновления ...) process="@this"
здесь не требуется, при условии, что кнопка содержится в компоненте значения процесса.
- Для всех кнопок без нужной проверки установите
immediate="true"
.
- Если ничего из вышеперечисленного не работает (что произошло с кнопками Add, возможно, из-за рекурсии
ui:include
), задайте process="@this"
, immediate="true"
и update="@none"
, а затем oncomplete="remoteCommandName();"
и укажите p:remoteCommand
вместо этого с таким именем с process
, immediate
и update
, упомянутыми в вышеуказанных пунктах.
- Если ничего из вышеперечисленного не работает (что произошло с некоторыми другими кнопками, возможно, из-за того, что он был еще одним слоем глубже в рекурсии
ui:include
) ... оберните h:panelGroup
вокруг следующего c:forEach
и затем обновите PrimeFaces ID этого в самой кнопке при сохранении ее вызова remoteCommand
впоследствии, как указано выше.
- Если ничего из вышеперечисленного не работает (что случилось со мной снова) ... Попробуйте следующий код:
- В
p:commandButton(s)
: oncomplete="$('.FixButtonSC').click();"
- В
p:fieldset
с классом стилей FieldsetSC:
<!-- Fix (hidden) button. -->
<p:commandButton id="FixButton" styleClass="FixButtonSC"
process="@this" update="@(.FieldsetSC)" style="display: none;" />
Надеюсь, это поможет ...