Comment les PrimeFaces sélectionnent les sélecteurs comme dans update="@(.myClass) " travail?

je ne comprends pas comment PrimeFaces sélecteurs ( PFS ).

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

je peux l'utiliser. Et je pense que c'est un outil fantastique mais il ne fonctionne pas toujours pour moi. Le .myClass est le sélecteur jQuery côté client. Comment JSF du côté du serveur sait - il quoi mettre à jour?

je peux comprendre la façon normale JSF sélecteurs d'ID de travail.

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

le textId renvoie un ID de component dans l'arbre des Components tel que défini dans le fichier XHTML du côté du serveur. Je peux donc comprendre comment JSF trouve le bon composant.

mais si vous utilisez des sélecteurs primefaces, les sélecteurs jQuery côté client sont utilisés. Comment le JSF sait-il quelle composante doit être mise à jour? Parfois, J'ai des problèmes avec le PFS. Il ne semble pas fonctionner toujours pour moi. Est-il quelque chose que vous devriez garder à l'esprit si vous utilisez PFS?

32
demandé sur Community 2013-11-19 23:57:42

1 réponses

vous savez probablement déjà que PrimeFaces utilise jQuery sous les couvertures. Les sélecteurs PrimeFaces sont basés sur jQuery. Tout ce que vous spécifiez dans @(...) sera utilisé comme sélecteur jQuery sur le DOM tree HTML courant. Pour tout élément HTML trouvé, qui a un ID, exactement cet ID sera finalement utilisé dans le update .

en gros, pour un update="@(.myclass)" , les PrimeFaces sous les couvertures font à peu près ceci:

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.

So, dans le cas de p.ex.

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

ce bouton de commande mise à jour

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

aura exactement le même effet que

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

noter que cela fonctionne aussi pour les IDs autogénérés. I. e. le <h:form id> n'est pas obligatoire.


parfois, j'ai des problèmes avec le PFS. Est-il quelque chose que vous devez garder vous pensez à utiliser PFS ?

il peut arriver que vous ayez choisi" trop "(par exemple @(form) ne sélectionne pas la forme courante, mais tous formes, exactement comme $("form") en jQuery!), ou que vous n'avez rien sélectionné (lorsque L'élément HTML DOM désiré n'a pas D'ID). L'étude des ID d'éléments dans L'arborescence des DOM HTML et de la charge utile de la requête dans le moniteur de trafic HTTP devrait donner des indices.

les éléments désirés dans le DOM arbre HTML doivent avoir un ID (autogénéré). Le paramètre de requête javax.faces.partial.render dans le moniteur de trafic HTTP doit contenir les bonnes ID de client. L'attribut rendered de l'élément dans l'arbre des composants JSF doit évaluer true pendant la mise à jour. Etcetera.

Dans votre exemple, le <h:outputText> ne finira pas dans le générés Sortie HTML avec N'importe quel ID. L'assigner à un id devrait résoudre votre problème de mise à jour.

donc, cet exemple ne marchera pas

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

mais cet exemple fonctionnera (notez qu'il n'est pas nécessaire d'attribuer un ID au formulaire):

<h:form>
    <h:outputText id="myText" value="#{bean.text1}" styleClass="myClass" />
    <p:commandButton value="Update" update="@(.myClass)" /> 
</h:form>
57
répondu BalusC 2013-11-29 13:13:02