Понимание PrimeFaces process / update и JSF f:AJAX execute/render attributes



что именно process и update в PrimeFaces p:commandXxx компоненты и execute и render на f:ajax тег?



что работает во время проверки? Что значит update атрибут делает, а не обновляет значение для компонента с задней стороны? Делай process атрибут привязать значение к модели? Что именно делать @this,@parent,@all и @form в обоих атрибутами?



пример ниже работает нормально, но я немного запутался в основных концепция.



<p:commandButton process="@parent"
update="@form"
action="#{bean.submit}"
value="Submit" />
1113   3  

3 ответов:

<p:commandXxx process><p:ajax process><f:ajax execute>

The process атрибут находится на стороне сервера и может влиять только на UIComponents реализация EditableValueHolder (поля ввода) или ActionSource (команда поля). Элемент process атрибут сообщает JSF, используя разделенный пробелом список идентификаторов клиентов, какие компоненты точно должны быть обработаны через весь жизненный цикл JSF при (частичной) форме отправки.

JSF затем применит запрос значения (поиск параметра HTTP-запроса на основе собственного идентификатора клиента компонента, а затем либо установка его в качестве переданного значения в случае EditableValueHolder компоненты или очереди новый ActionEvent в случае ActionSource компоненты), выполнить преобразование, проверку и обновление значений модели (EditableValueHolder только компоненты) и, наконец, вызвать очередь ActionEvent (. Также, компоненты которых значение false во время применения значения запроса фазы также будут пропущены как часть защиты от подделанных запросов.

обратите внимание, что в случае ActionSource компоненты (такие как <p:commandButton>) очень важно, чтобы вы также включили сам компонент в process атрибут, особенно если вы собираетесь вызвать действие, связанное с компонентом. Таким образом, приведенный ниже пример, который намеревается обрабатывать только определенные входные компоненты, когда вызывается определенный командный компонент, который не будет работать:

<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />

он будет обрабатывать только #{bean.foo} и не the #{bean.action}. Вам также нужно будет включить сам командный компонент:

<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />

или, как вы, видимо, узнали, используя @parent если они оказались единственными компонентами, имеющими общий родитель:

<p:panel><!-- Type doesn't matter, as long as it's a common parent. -->
    <p:inputText id="foo" value="#{bean.foo}" />
    <p:commandButton process="@parent" action="#{bean.action}" />
</p:panel>

или, если они оба оказались единственными компонентами родительского UIForm компонент, то вы также можете использовать @form:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" />
    <p:commandButton process="@form" action="#{bean.action}" />
</h:form>

это иногда нежелательно, если форма содержит больше входных компонентов, которые вы хотите пропустить при обработке, чаще, чем в тех случаях, когда вы хотите обновить другой входной компонент(ы) или некоторый раздел пользовательского интерфейса на основе текущего входного компонента в методе прослушивателя ajax. Вы, а именно, не хотите, чтобы ошибки проверки на других входных компонентах препятствовали использованию метода прослушивателя ajax выполненный.

тут @all. Это не имеет никакого специального эффекта в , только в . А process="@all" ведет себя точно так же, как process="@form". HTML не поддерживает отправку нескольких форм одновременно в любом случае.

там кстати тоже a @none что может быть полезно в случае, если вы абсолютно не нужно ничего обрабатывать, но только хотите обновить некоторые конкретные части через update, особенно те разделы чье содержание не зависит от представленных значений или прослушивателей действий.

следует отметить, что и нет влияние на полезную нагрузку HTTP-запроса (количество параметров запроса). Значение, поведение HTML по умолчанию отправки "все", содержащееся в HTML-представлении <h:form> не будет затронут. В случае, если у вас есть большая форма, и вы хотите уменьшить полезную нагрузку HTTP-запроса только до этих абсолютно необходимых обработка, т. е. только эти покрыты process атрибут, то вы можете установить partialSubmit атрибут в компонентах Ajax PrimeFaces как в <p:commandXxx ... partialSubmit="true"> или <p:ajax ... partialSubmit="true">. Кроме того, вы также можете использовать <o:form> из OmniFaces 3.0+, который по умолчанию для этого поведения.

стандартный эквивалент JSF для конкретных примитивов process и execute С <f:ajax execute>. Он ведет себя точно так же, за исключением того, что он не поддерживает строку, разделенную запятыми, в то время как PrimeFaces one делает (хотя я лично рекомендую просто придерживаться Конвенции с разделением пространства), ни @parent ключевое слово. Кроме того, может быть полезно знать, что <p:commandXxx process> по умолчанию @form пока <p:ajax process> и <f:ajax execute> по умолчанию @this. Наконец, это также полезно знать, что process поддерживает так называемые "селекторы PrimeFaces", см. также как сделать селекторы PrimeFaces, как в update="@(.myClass) " работа?


<p:commandXxx update><p:ajax update> <f:ajax render>

The update атрибут является клиентской стороной и может повлиять на HTML-представление всех UIComponentы. Элемент update атрибут сообщает JavaScript (тот, который отвечает за обработку запроса/ответа ajax), используя разделенный пробелом список идентификаторов клиентов, какие части в дереве HTML DOM необходимо обновить в качестве ответа на отправку формы.

JSF затем подготовит правильный ответ ajax для этого, содержащий только запрошенные части к обновление. JSF пропустит все остальные компоненты, которые не охвачены update атрибут в ответе ajax, тем самым сохраняя полезную нагрузку ответа небольшой. Кроме того, компоненты, чьи значение false во время рендеринга фаза ответа будет пропущена. Обратите внимание, что даже если он вернется true, JavaScript не может обновить его в дереве HTML DOM, если он был изначально false. Вместо этого вам нужно будет обернуть его или обновить его родителя. Смотрите также Ajax update / render не работает на компоненте, который отрисовал атрибут.

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

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" required="true" />
    <p:message id="foo_m" for="foo" />
    <p:inputText id="bar" value="#{bean.bar}" required="true" />
    <p:message id="bar_m" for="bar" />
    <p:commandButton action="#{bean.action}" update="@form" />
</h:form>

(заметим, что process атрибут опущен, так как по умолчанию @form уже)

хотя это может работать нормально, обновление входных и командных компонентов в данном конкретном примере не требуется. Если вы не измените значения модели foo и bar внутри action метод (который, в свою очередь, был бы неинтуитивным в перспективе UX), нет смысла их обновлять. Компоненты сообщения являются единственными, которые действительно необходимо обновить:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" required="true" />
    <p:message id="foo_m" for="foo" />
    <p:inputText id="bar" value="#{bean.bar}" required="true" />
    <p:message id="bar_m" for="bar" />
    <p:commandButton action="#{bean.action}" update="foo_m bar_m" />
</h:form>

однако, это становится утомительным, когда у вас есть многие из них. Это одна из причин, почему существуют селекторы PrimeFaces. Те компоненты сообщения имеют в сгенерированном HTML выводе общий класс стиля ui-message, поэтому следует также сделать следующее:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" required="true" />
    <p:message id="foo_m" for="foo" />
    <p:inputText id="bar" value="#{bean.bar}" required="true" />
    <p:message id="bar_m" for="bar" />
    <p:commandButton action="#{bean.action}" update="@(.ui-message)" />
</h:form>

(обратите внимание, что вы должны сохранить идентификаторы на компонентах сообщения, в противном случае @(...) не работает! Опять же, смотрите как сделать селекторы PrimeFaces, как в update="@(.myClass) " работа? за деталь)

The @parent обновляет только родительский компонент, который, таким образом, охватывает текущий компонент и всех братьев и сестер. свой ребенок. Это более полезно, если вы разделили форму на вменяемые группы с каждой своей собственной ответственностью. Элемент @this обновляет, очевидно, только текущий компонент. Обычно это необходимо только в том случае, если вам нужно изменить один из собственных атрибутов HTML компонента в методе действия. Е. Г.

<p:commandButton action="#{bean.action}" update="@this" 
    oncomplete="doSomething('#{bean.value}')" />

представьте себе, что oncomplete нужно работать с value что изменилось в action, то эта конструкция не будет работать, если компонент не обновляется, по той простой причине, что oncomplete является частью сгенерированного вывода HTML (и, таким образом, все выражения EL там оцениваются во время ответа рендеринга).

The @all обновляет весь документ, который следует использовать с осторожностью. Обычно вы хотите использовать для этого запрос true GET либо по простой ссылке (<a> или <h:link>) или перенаправление после публикации по ?faces-redirect=true или ExternalContext#redirect(). В эффектах,process="@form" update="@all" имеет точно такой же эффект, как и не-ajax (неполный) submit. В моем вся карьера JSF, единственный разумный случай использования, с которым я столкнулся для @all, чтобы отобразить страницу ошибки в полном объеме в случае, если исключение возникает во время AJAX-запроса. Смотрите также как правильно обращаться с исключениями JSF 2.0 для AJAXified компонентов?

стандартный эквивалент JSF для конкретных примитивов update и render с <f:ajax render>. Он ведет себя точно так же, за исключением того, что он не поддерживает строку, разделенную запятыми, в то время как PrimeFaces one делает (хотя я лично рекомендую просто придерживаться Конвенции с разделением пространства), ни @parent ключевое слово. Оба update и render по умолчанию @none (что означает "ничего").


Читайте также:

Если вам трудно запомнить значения по умолчанию (я знаю, что у меня есть...) вот краткая выдержка из ответа BalusC это:

Component    | Submit          | Refresh
------------ | --------------- | --------------
f:ajax       | execute="@this" | render="@none"
p:ajax       | process="@this" | update="@none"
p:commandXXX | process="@form" | update="@none"

по процессу (в спецификации JSF это называется execute) вы говорите JSF ограничить обработку компонентом, который указан, все остальное просто игнорируется.

update указывает, какой элемент будет обновлен, когда сервер ответит на ваш запрос.

@all : каждый компонент обрабатывается договора.

@this: запрашивающий компонент с атрибутом execute является обработки/визуализации.

@form: форма, содержащая запрашивающий компонент, обрабатывается / визуализируется.

@ parent: родительский элемент, содержащий запрашивающий компонент, обрабатывается / визуализируется.

с помощью Primefaces вы даже можете использовать селекторы JQuery, проверьте этот блог:http://blog.primefaces.org/?p=1867

Comments

    Ничего не найдено.