Что такоедействительно должен делать?Это POSTS только вмещающая форма - PullRequest
9 голосов
/ 08 июня 2010

извините, если я толстый, но что действительно должен делать 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 ]

8 голосов
/ 19 декабря 2015

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, он все равно будет отправлять только прилагающуюся форму. На это плохое поведение не следует полагаться. Они могут исправить это неправильное поведение на своей стороне рано или поздно.

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

4 голосов
/ 11 октября 2010

Вот цитата из JavaServer Faces 2.0 - Полная ссылка , стр. 352:

Ключевые слова execute и render принимают набор специальных ключевых слов, каждое из которых имеет значение, показанное в этой таблице:

@ all (используется с execute): каждый компонент на странице отправлен и обработан . Это полезно, когда вы хотите сделать полностраничную отправку.

Я думаю, что это довольно ясно говорит о том, что поля из всех форм должны быть отправлены с запросом AJAX.

Однако даже с Mojarra 2.0.3 этого не происходит. Несмотря на содержимое атрибута execute (независимо от того, помещаете ли вы список форм или @all), только вложенная форма получает свои 'поля, отправленные. Так что это похоже на ошибку. Я поднимаю вопрос по этому поводу, если нет изменения мнения?

1 голос
/ 10 июня 2010

Это должно было бы быть execute = ": form1 form2" (если у вас есть разделитель по умолчанию), но в любом случае, нет Отправляет только второй.

Если вы введете @all в первой форме, она отправит только первую. По крайней мере, в Safari 5 / Firefox 3.6.3 в любом случае. Я думаю, что нужно было бы взглянуть на javascript mojarra, чтобы узнать больше.

0 голосов
/ 10 июня 2010

Вы пробовали это?

<f:ajax execute="form1 form2" />

Отправляет ли он данные обеих форм, если вы явно упоминаете их?

AFAIK, вы правы: @all представляет всю страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...