¿Qué son exactamente process y update en PrimeFaces p:commandXxx componentes y execute y render en f:ajax etiqueta?

Que trabaja en el momento de la validación? ¿Qué update atributo en lugar de actualizar el valor de los componentes de back-end? Hacer process atributo valor de enlace a la modelo? ¿Qué es exactamente lo @this, @parent, @all y @form en ambos atributos?

El ejemplo de abajo está trabajando bien, pero estoy un poco confundido en conceptos básicos.

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

OriginalEl autor Shardendu | 2014-08-16

3 Comentarios

  1. 256

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

    La process atributo es el lado del servidor y sólo puede afectar a UIComponentla implementación de EditableValueHolder (campos de entrada) o ActionSource (comando de campos). El process atributo indica JSF, utilizando una lista separada por espacios de los Identificadores de cliente, los componentes que exactamente debe ser procesada a través de todo el ciclo de vida de JSF (parcial) formulario de envío.

    JSF se aplica entonces la solicitud de valores (la búsqueda de la solicitud HTTP parámetro basado en el componente de la propia ID de cliente y, a continuación, establecer como valor enviado en caso de EditableValueHolder componentes o el sistema de colas de un nuevo ActionEvent en caso de ActionSource componentes), llevar a cabo la conversión, validación y actualización de los valores del modelo (EditableValueHolder sólo los componentes) y, finalmente, invocar la cola ActionEvent (ActionSource sólo los componentes). JSF se saltan el procesamiento de todos los otros componentes que no están cubiertos por process atributo. También, los componentes cuya rendered atributo evalúa a false durante aplicar solicitud de los valores de fase también se omite como parte de una salvaguardia contra el manipulado de las solicitudes.

    Tenga en cuenta que en caso de ActionSource componentes (tales como <p:commandButton>) muy importante que también incluyen el componente de sí mismo en el process atributo, especialmente si usted tiene la intención de invocar la acción asociada con el componente. Por lo que el siguiente ejemplo en el que se quiere procesar sólo ciertos entrada de componente(s) cuando un cierto componente comando se invoca no va a trabajar:

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

    Sería sólo del proceso de la #{bean.foo} y no la #{bean.action}. Sería necesario incluir el componente comando de sí mismo así:

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

    O, como se encontró al parecer, el uso de @parent si son los únicos componentes de tener un padre en común:

    <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>

    O, si ambos son los únicos componentes de los padres UIForm componente, entonces también puede utilizar @form:

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

    Esto a veces es indeseable si el formulario contiene más componentes de entrada que usted desea saltar en el procesamiento, más a menudo en los casos en que le gustaría actualizar a otra entrada de componente(s) o a una interfaz de usuario sección, basada en la corriente de entrada de componente en un ajax método del detector. Usted a saber, no quieren que los errores de validación de otros componentes de entrada de prevenir el ajax método detector de ser ejecutado.

    Luego está el @all. Esto no tiene ningún efecto especial en process atributo, pero sólo en update atributo. Un process="@all" se comporta exactamente de la misma como process="@form". HTML no admite la presentación de múltiples formas a la vez de todos modos.

    Hay por el camino también un @none que puede ser útil en caso de que usted absolutamente no necesita procesar nada, pero sólo desea actualizar algunas partes específicas a través de update, particularmente de aquellos sectores cuyo contenido no depende de los valores enviados o acción de los oyentes.

    Señaló que la process atributo tiene no influencia en la solicitud HTTP carga (la cantidad de parámetros de solicitud). El significado, el valor por defecto HTML comportamiento de envío de «todo» contenida en el código HTML de la representación de la <h:form> no serán afectados. En caso de que usted tiene una gran forma, y se desea reducir la petición HTTP carga sólo a estas absolutamente necesario en el procesamiento, es decir, sólo estas cubierto por process atributo, entonces se puede establecer la partialSubmit atributo en PrimeFaces los componentes de Ajax como en <p:commandXxx ... partialSubmit="true"> o <p:ajax ... partialSubmit="true">. Como alternativa, también puede utilizar <o:forma> de OmniFaces 3.0+ el valor por defecto de este comportamiento.

    El estándar de JSF equivalente a la PrimeFaces específicos process es execute de <f:ajax execute>. Se comporta exactamente el mismo, salvo que no admite una cadena separada por comas, mientras que el PrimeFaces que uno hace (aunque yo personalmente recomiendo a atenerse sólo a las separados por espacios convención), ni la @parent palabra clave. También, puede ser útil saber que <p:commandXxx process> valores predeterminados para @form mientras <p:ajax process> y <f:ajax execute> valores predeterminados para @this. Por último, también es útil saber que process apoya el así llamado «PrimeFaces Selectores», véase también ¿Cómo PrimeFaces Selectores como en update=»@(.miclase)» el trabajo?


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

    La update atributo es del lado del cliente y puede afectar a la representación de HTML de todos los UIComponents. El update atributo indica JavaScript (el responsable del manejo de la petición ajax/respuesta), utilizando una lista separada por espacios de los Identificadores de cliente, que las partes en el DOM de HTML árbol necesita ser actualizado como respuesta al formulario de envío.

    JSF preparará el derecho de respuesta de ajax para que, conteniendo sólo la pidió a las partes para actualizar. JSF se salte todos los otros componentes que no están cubiertos por update atributo en la respuesta de ajax, por medio de la presente mantener la respuesta de carga pequeña. También, los componentes cuya rendered atributo evalúa a false durante el procesamiento de la respuesta de fase serán omitidos. Tenga en cuenta que aunque volvería true, JavaScript no se puede actualizar en el DOM de HTML árbol, si fue inicialmente false. Usted necesitaría para envolver o actualización de su padre en su lugar. Véase también Ajax actualización/render no funciona en un componente que ha hecho atributo.

    Por lo general, usted desea actualizar sólo los componentes que realmente necesidad de ser «renovado» en el lado del cliente (parcial) formulario de envío. El ejemplo a continuación de las actualizaciones de la totalidad de los padres se forman a través de @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>

    (tenga en cuenta que process atributo es omitido ya que por defecto @form ya)

    Mientras que puede que funcione bien, la actualización de la entrada de comando y de los componentes es en este ejemplo en particular innecesarios. A menos que cambie el modelo de valores foo y bar dentro de action método (que a su vez podría ser poco intuitivo en UX perspectiva), no hay ningún punto de la actualización de ellos. El mensaje de los componentes son los únicos que realmente necesita ser actualizado:

    <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>

    Sin embargo, que obtiene tedioso cuando se tienen muchos de ellos. Esa es una de las razones por las que PrimeFaces Selectores de existir. Los componentes del mensaje han generado en la salida HTML de un estilo común de la clase de ui-message, por lo que también debe hacer:

    <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>

    (tenga en cuenta que usted debe guardar los Identificadores de los componentes de mensaje, de lo contrario @(...) no funciona! De nuevo, ver ¿Cómo PrimeFaces Selectores como en update=»@(.miclase)» el trabajo? para el detalle)

    La @parent actualizaciones sólo el componente de los padres, lo que cubre la componente de corriente y todos los hermanos y sus hijos. Esto es más útil si usted se ha separado la forma en sane grupos con cada uno su propia responsabilidad. El @this actualizaciones, obviamente, sólo la componente de corriente. Normalmente, esto sólo es necesario cuando usted necesita para cambiar uno de los componentes propios de atributos HTML en el método de acción. E. g.

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

    Imaginar que el oncomplete se necesita para trabajar con la value que es cambiado en action, entonces esta construcción no hubiera funcionado si el componente no está actualizado, por la sencilla razón de que oncomplete es parte de HTML generado de salida (y por lo tanto todo EL expresiones no son evaluados durante el procesamiento de la respuesta).

    La @all actualizaciones de todo el documento, que debe ser utilizado con cuidado. Normalmente, usted quisiera utilizar una verdadera solicitud GET para este lugar por un simple enlace (<a> o <h:link>) o una redirección después de la POST por ?faces-redirect=true o ExternalContext#redirect(). En efectos, process="@form" update="@all" tiene exactamente el mismo efecto que un no-ajax (no parcial) se someten. En toda mi JSF carrera, la única respuesta sensata caso de uso que he encontrado para @all es mostrar una página de error en su totalidad en caso de que se produce una excepción durante una petición ajax. Véase también ¿Cuál es la manera correcta de lidiar con JSF 2.0 excepciones para AJAXified componentes?

    El estándar de JSF equivalente a la PrimeFaces específicos update es render de <f:ajax render>. Se comporta exactamente el mismo, salvo que no admite una cadena separada por comas, mientras que el PrimeFaces que uno hace (aunque yo personalmente recomiendo a atenerse sólo a las separados por espacios convención), ni la @parent palabra clave. Ambos update y render valores predeterminados para @none (que es, «nada»).


    Ver también:

    Cuando yo uso el update=»» entonces la propiedad administrada del backing bean no consigue establecer y mi @PostConstruct rutina de falla. Los pensamientos? EDITAR:•Si usted está buscando una propiedad administrada de #{param} de estar presente en las solicitudes POST posteriores, entonces usted necesita para incluirlo como <f:param> en el UICommand componentes.
    puede un proceso de actualización de un panelGroup proceso/actualización de los contenidos de este panelGroup ex : <h:panelGroup id=»pgId»>//entrada de textos va aquí<h:panelGroup><p:commandLink proceso=»pgId» update=»pgId»/>
    Thx @BalusC por esta estupenda explicación!
    porque process no está establecida, por lo que se utiliza el valor predeterminado de @form. Esto también se explica en la respuesta anterior.
    es el escondite de una forma diferente, más serio, el problema con la app config.

    OriginalEl autor BalusC

  2. 48

    Si usted tiene problemas para recordar los valores por defecto (sé que tengo…) he aquí un breve extracto de la BalusC la respuesta:

    Componente | Presentar | Actualizar 
    ------------ | --------------- | -------------- 
    f:ajax | execute="@este" | render="@none" 
    p:ajax | proceso="@este" | actualización="@none" 
    p:commandXXX | proceso="@" formulario | actualización="@none" 
    
    Sólo una pequeña corrección: el valor predeterminado de process para p:commandXXX es @all. Además, esto parece aplicar para cada componente de apoyo a AJAX, tales como p:menuitem.
    Hola @StephanRauh, muchas gracias por el comentario. Donde has leído el valor predeterminado es @all? Por lo que puedo leer de BalusC la respuesta es @form, sin embargo @all es equivalente a @form en el proceso. Buen punto sobre los otros componentes, supongo que tendré que buscar en el código fuente cuando el tiempo para ver qué componentes se aplica, como no voy a escribir de algo que puede ser malo
    Thomas Andraschko me dijo acerca de la @all poco. Él debe saber, él se volvió a implementar el AJAX motor de PrimeFaces recientemente. Más tarde, me doble comprobado, pero leyendo el código fuente de PrimeFaces y mirando las peticiones XHR. Espero que la tengo bien esta vez porque he implementado las solicitudes AJAX de BootsFaces para funcionar de forma idéntica a las solicitudes AJAX de PrimeFaces.
    Sería engañoso decir, que el valor por defecto es @todos cuando HTML no es compatible con el envío de múltiples formas. Los desarrolladores necesitan saber el valor efectivo predeterminado (por lo que Thomas podría cambiar en consecuencia). Por cierto, estos valores predeterminados se están incorrectamente definido como null en el Primefaces manual de Usuario 6.2.

    OriginalEl autor Jaqen H’ghar

  3. 21

    Por proceso (en la especificación de JSF se llama ejecutar) informar a JSF para limitar el procesamiento de los componentes que se especifican todo lo demás es simplemente ignorado.

    actualización indica que el elemento se actualiza cuando el servidor de responder de nuevo a usted solicita.

    @todos : Cada componente se procesa o prestados.

    @este: El componente de petición con la ejecución de atributo se procesa o prestados.

    @formulario : el formulario que contiene El componente de petición se procesa o prestados.

    @padre: El padre que contiene el componente de petición se procesa o prestados.

    Con Primefaces usted puede incluso utilizar los selectores de JQuery, echa un vistazo a este blog: http://blog.primefaces.org/?p=1867

    OriginalEl autor faissalb

Dejar respuesta

Please enter your comment!
Please enter your name here