Si un composant dont vous souhaitez pour référence par ajax processus/exécution/mise à jour/rendu n'est pas à l'intérieur de la même NamingContainer
parent, alors vous devez le référencer à l'aide d'un absolu de l'IDENTIFIANT client à la place d'un parent ID de client.
NamingContainer
des composants sont par exemple <h:form>
, <h:dataTable>
, <p:tabView>
, <cc:implementation>
(ainsi, tous les composants composites), etc. Vous les reconnaîtrez facilement en regardant le code HTML généré en sortie, de leur pièce d'identité sera ajouté au client généré ID de tous les composants enfants.
Un absolu de l'IDENTIFIANT client commence avec l' NamingContainer
caractère de séparation, qui est par défaut :
.
Pour les débutants qui n'ont pas mémorisé tout cela, un moyen facile de trouver la bonne ID de client est d'ouvrir la page dans le navigateur et de localiser l'élément HTML représenté par la JSF composante d'intérêt. C'est, dans votre cas particulier d' <h:panelGrid id="display">
un <table>
. Si ce n'est pas par lui-même à l'intérieur d'un autre NamingContainer
parent, alors l'ID du client est probablement juste <table id="display">
. Comme il n'est pas à l'intérieur de la même NamingContainer
des parents comme de l'endroit où vous êtes à l'exécution de la requête ajax, vous avez besoin de préfixe exactement ce client ID :
.
<p:commandLink update=":display">
Mais si c'est par exemple à l'intérieur d'un <p:tabView id="tabs"><h:form id="form">
, alors l'ID du client est susceptible <table id="tabs:form:display">
.
<p:commandLink update=":tabs:form:display">
Tout cela est spécifié que "la recherche de l'expression" dans l' UIComponent#findComponent()
javadoc:
Une expression de recherche se compose d'un identifiant (qui est parfaitement adaptée à l'encontre de la propriété id de UIComponent
, ou une série de tels identifiants liés par l' UINamingContainer#getSeparatorChar
la valeur du caractère. L'algorithme de recherche doit fonctionne de la façon suivante, si suppléant alogrithms peut être utilisé tant que le résultat final est le même:
- Identifier l'
UIComponent
qui sera la base pour la recherche, en s'arrêtant dès que l'une des conditions suivantes est remplie:
- Si l'expression de recherche commence par le caractère séparateur (appelé un "absolu" de recherche de l'expression), la base sera la racine de
UIComponent
de la composante de l'arbre. Le premier caractère de séparation sera éliminé, et le reste de l'expression de recherche sera traitée comme une "relative" à l'expression de recherche comme décrit ci-dessous.
- Sinon, si c'
UIComponent
est NamingContainer
il servira de base.
- Sinon, recherchez jusqu'les parents de ce composant. Si un
NamingContainer
est rencontré, elle sera la base.
- Sinon (si pas d'
NamingContainer
est rencontré) la racine UIComponent
sera la base.
- L'expression de recherche (éventuellement modifié dans l'étape précédente) est maintenant une "relative" à l'expression de recherche qui sera utilisé pour localiser le composant (le cas échéant) qui a un id qui correspond, dans le cadre de la composante de base. Le match se déroule comme suit:
- Si l'expression de recherche est un identificateur simple, cette valeur est comparée à la propriété id, et puis, de manière récursive à travers les facettes et les enfants de la base
UIComponent
(sauf que, si un descendant NamingContainer
est trouvé, son propre facettes et les enfants ne sont pas cherché).
- Si l'expression de recherche comprend plus d'un identificateur séparés par le caractère de séparation, le premier identifiant est utilisé pour localiser un
NamingContainer
par les règles en la puce précédente. Ensuite, l' findComponent()
méthode de NamingContainer
sera appelé, en passant le reste de l'expression de recherche.
Notez que PrimeFaces adhère également la JSF spec, mais RichFaces utilise "certaines exceptions supplémentaires".
"reRender" utilise UIComponent.findComponent()
algorithme (avec quelques exceptions) pour trouver le composant dans le composant de l'arbre.
Ces exceptions ne sont nulle part décrit en détail, mais il est connu que, par rapport Id composant (c'est à dire ceux qui ne sont pas en commençant par :
) ne sont pas uniquement cherché dans le contexte de la plus proche parent NamingContainer
, mais aussi dans tous les autres NamingContainer
de composants dans le même point de vue (ce qui est relativement cher travail par la voie).
Si cela ne fonctionne toujours pas, vérifiez si vous n'utilisez pas <h:form prependId="false">
. On va à l'échec cours de traitement de l'ajax soumettre et de rendu. Voir aussi cette question: JSF NamingContainer et UIForm avec prependId.