Что на самом деле должен делать <f: ajax execute = "@ all">? Он размещает только вложенную форму
Извините, если я толстый, но что на самом деле должен делать execute="@all" в теге f:ajax? Я ожидал, что он отправит все элементы на странице, но, похоже, он размещает только значения в прилагаемой форме, а не все формы на странице.
Например
<h:body>
<h:form id="form1">
Input1/Form1 <h:inputText id="testinput" value="#{testBean.input1}" />
</h:form>
<h:form id="form2">
Input2/form2 <h:inputText id="testinput2" value="#{testBean.input2}" />
<h:commandButton value="Ok" actionListener="#{testBean.al}">
<f:ajax execute="@all" />
</h:commandButton>
</h:form>
</h:body>
Только форма2 размещена на клике.
Используя моджарру 2.0.2..
4 ответа
execute="@all"
был просто серьезным упущением при разработке спецификации JSF2. JSF отчасти абстрагировался от своей природы, основанной на HTML-формах, забывая, что в конечном итоге это фактически генератор HTML-кода.
В HTML отправка формы, отличной от вложенной, запрещена. Так execute="@all"
никогда не будет работать с этой точки зрения. Он будет вести себя точно так же, как execute="@form"
, Учитывая, что JSF является просто генератором HTML-кода, та же "проблема" затронет и JSF. Невозможно обработать несколько <h:form>
компоненты сразу.
Если вам действительно нужна эта функция по какой-то причине, вы должны сделать шаг назад и пересмотреть неправильный взгляд на HTML-формы. Вы должны убедиться, что ваши формы разработаны таким образом, что вам никогда не понадобится информация из другой формы.
Смотрите также:
PrimeFaces уже рано понял, что @all
был в корне не прав. Именно поэтому они никогда не поддерживали @all
в process
атрибут, их эквивалент execute
, Они изначально тоже никогда не поддерживали @all
в update
, их эквивалент render
, Однако единственный реальный случай использования, где это имело смысл, - обработка полной страницы ошибки во время исключения ajax, поэтому в конечном итоге они принесли update="@all"
назад после того, как я создал FullAjaxExceptionHandler
, process="@all"
будет по-прежнему иметь точно такой же эффект, как process="@form"
,
Однако та же самая библиотека PrimeFaces также непреднамеренно сделала воображаемое поведение execute="@all"
возможно через его позже представленный partialSubmit="true"
особенность, посредством которой вы явно указываете все другие формы, как показано ниже ( PFS @(form)
просто для упрощения, жестко закодированная коллекция :formId1 :formId2 :formId3
и т. д. тоже просто возможно).
<p:commandButton ... process="@(form)" partialSubmit="true" />
Это работает, потому что partialSubmit="true"
готовит process="xxx"
на стороне клиента, а не на стороне сервера. Другими словами, вместо отправки всей вложенной формы с сервера на клиент, а затем обработки указанных входных данных, он отправляет только указанные входные данные с сервера на клиент, а затем обрабатывает их все. Обратите внимание, что когда partialSubmit
отсутствует или установлен на false
, тогда он все равно только отправит прилагающуюся форму. На это плохое поведение не следует полагаться. Они могут исправить это неправильное поведение на своей стороне рано или поздно.
Смотрите также:
Вот цитата из JavaServer Faces 2.0 - Полная ссылка, страница 352:
Ключевые слова execute и render принимают набор специальных ключевых слов, каждое из которых имеет значение, показанное в этой таблице:
@all (используя с
execute
): Каждый компонент на странице представлен и обработан. Это полезно, когда вы хотите сделать полную страницу отправки.
Я думаю, что это довольно ясно говорит о том, что поля из всех форм должны быть отправлены с запросом AJAX.
Однако даже с Mojarra 2.0.3 этого не происходит. Несмотря на содержание execute
атрибут (независимо от того, положите ли вы список форм или @all
) только вложенная форма получает свои поля. Так что это похоже на ошибку. Я поднимаю вопрос об этом, если нет изменения мнения?
Это должно было бы быть execute=":form1 form2" (если у вас есть разделитель по умолчанию), но в любом случае нет, это не так. Это только отправляет второй.
Если вы введете @all в первой форме, она отправит только первую. По крайней мере, в Safari 5/Firefox 3.6.3 в любом случае. Я думаю, что нужно было бы посмотреть на javascript mojarra, чтобы узнать больше.
Вы пробовали это?
<f:ajax execute="form1 form2" />
Отправляет ли он данные обеих форм, если вы явно упоминаете их?
AFAIK, вы правы: @all представляет всю страницу.