Cómo funcionan los selectores PrimeFaces como en update="@(.MyClass) " work?


No entiendo cómo selectores PrimeFaces (PFS) trabajo.

<h:outputText value="#{bean.text1}" styleClass="myClass" />
<p:commandButton update="@(.myClass)" />

Puedo usarlo. Y creo que es una herramienta fantástica aunque no siempre funciona para mí. .myClass es el selector de jQuery del lado del cliente. ¿Cómo sabe JSF en el lado del servidor qué actualizar?

Puedo entender cómo funcionan los selectores de ID de JSF normales.

<h:outputText value="#{bean.text1}" id="textId" />
<p:commandButton update="textId" />

El textId hace referencia a un ID del componente en el árbol de componentes como se define en el archivo XHTML en el lado del servidor. Así que puedo comprenda cómo JSF encuentra el componente correcto.

Pero si está utilizando selectores primefaces, se utilizan los selectores jQuery del lado del cliente. ¿Cómo sabe JSF qué componente debe actualizarse? A veces tengo problemas con la SSP. No parece funcionar siempre para mí. ¿Hay algo que debe tener en cuenta si está utilizando PFS?

Author: Community, 2013-11-19

1 answers

Probablemente ya sepa que PrimeFaces está usando jQuery bajo las portadas. Los selectores PrimeFaces están basados en jQuery. Cualquier cosa que especifique en @(...) se utilizará como selector de jQuery en el árbol DOM HTML actual. Para cualquier elemento HTML encontrado, que tiene un ID, exactamente este ID se utilizará en última instancia en el update.

Básicamente, para un update="@(.myclass)", PrimeFaces debajo de las cubiertas aproximadamente hacer esto:

var $elements = $(".myclass");
var clientIds = [];

$.each($elements, function(index, element) {
    if (element.id) {
        clientIds.push(":" + element.id);
    }
});

var newUpdate = clientIds.join(" "); // This will be used as `update` instead.

Así, en el caso de, por ejemplo,

<h:form id="formId">
    <h:outputText id="output1" styleClass="myclass" ... />
    <h:outputText styleClass="myclass" ... />
    <h:outputText id="output3" styleClass="myclass" ... />
</h:form>

Este botón de comando actualización

<p:commandButton ... update="@(.myclass)" />

Terminará con exactamente el mismo efecto que

<p:commandButton ... update=":formId:output1 :formId:output3" />

Tenga en cuenta que esto también funciona para IDS autogenerados. Es decir, el <h:form id> no es obligatorio.


A veces tengo problemas con la SSP. ¿Hay algo que debe tener en cuenta si está utilizando PFS ?

Puede suceder que haya seleccionado "demasiado" (por ejemplo, @(form) no selecciona la forma actual, sino todas las formas, exactamente como $("form") en jQuery!), o que realmente no ha seleccionado nada (cuando el elemento HTML DOM deseado no tiene realmente ningún ID). Investigar los identificadores de elementos en el árbol DOM HTML y la carga útil de la solicitud en el monitor de tráfico HTTP debería dar pistas.

Los elementos deseados en el árbol DOM HTML deben tener un ID (autogenerado). El parámetro de solicitud javax.faces.partial.render en el monitor de tráfico HTTP debe contener los ID de cliente correctos. El atributo rendered del elemento en el árbol de componentes JSF debe evaluar true durante la actualización. Etcétera.

En su ejemplo particular, el <h:outputText> no terminará en la salida HTML generada con ningún ID. Asignarle un id debería resolver su problema con su actualización.

Por lo tanto, este ejemplo no funcionará

<h:form>
    <h:outputText value="#{bean.text1}" styleClass="myClass" />
    <p:commandButton value="Update" update="@(.myClass)" /> 
</h:form>

Pero este ejemplo funcionará (tenga en cuenta que no es necesario asignar un ID al formulario):

<h:form>
    <h:outputText id="myText" value="#{bean.text1}" styleClass="myClass" />
    <p:commandButton value="Update" update="@(.myClass)" /> 
</h:form>
 57
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-29 13:13:02