Что на самом деле должен делать <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 представляет всю страницу.

Другие вопросы по тегам