web-dev-qa-db-fra.com

Primefaces - Impossible de trouver le composant avec l'identifiant en dehors de la table de données

 <ui:define name="content">
    <f:view>                        
    <h:form id="myForm" styleClass="form" >

        <p:dataTable var="provider" id="ss"  value="#{providerSelectBean.providerList}" rowKey="#{provider.license}"  

            selection="#{providerSelectBean.selectedProvider}" selectionMode="single"> 

            <p:ajax listener="#{providerSelectBean.onRowSelect}"    
                            update=":myForm:output"event="rowSelect"/>  

            <p:column sortBy="#{provider.license}" width="110" >
                <f:facet name="header">
                    <h:outputText value="License#" />
                </f:facet>
                <h:outputText value="#{provider.license}" />
            </p:column>

            <p:column sortBy="#{provider.prgName}" width="110" >
                <f:facet name="header">
                    <h:outputText value="Program Name" />
                </f:facet>
                <h:outputText value="#{provider.prgName}" />
            </p:column>

        </p:dataTable><br/>

        <p:panelGrid id="output" >
            <h:outputText value="License" />
            <h:outputText value="#{provider.license}" /> 
        </p:panelGrid>

    </h:form>           
    </f:view>

</ui:define>    

Ceci est mon premier passage avec JSF2.0 et primefaces 3.4.1 et le <p:ajax update donne une erreur

javax.faces.FacesException: Cannot find component with identifier  
":myForm:output"  referenced from "myForm:ss"
25
user1842840

Essayez d'inspecter le code HTML généré et de voir l'ID réel généré pour votre panelGrid et mettez à jour cet ID. S'il s'avère être dynamique, vous pouvez toujours utiliser les sélecteurs CSS JQuery (je me retrouve à le faire assez souvent). Dans votre cas, vous pouvez faire comme ceci:

update="@([id$=output])"

Cette expression représente chaque composant dont l'id se termine par la sortie. Jetez un œil aux documents JQuery pour plus d'informations.

27
Andre

Vous pouvez également utiliser :#{p:component(componentId)} comme dans

<p:ajax listener="#{providerSelectBean.onRowSelect}"  
update=":#{p:component('output')}" event="rowSelect"/>

Citant la réponse de BalusC à Obtenir l'ID du conteneur de nommage parent dans le modèle pour l'attribut de rendu/mise à jour :

p: component est une fonction d'assistance qui analyse la racine de la vue entière pour un composant avec l'ID donné, puis renvoie son ID client.

25
Can Yegane