2011-08-17 8 views
6

Kiedy próbuję renderować grupę panelową za pomocą wywołania ajax, to daje nieznany identyfikator.f: ajax wewnątrz interfejsu: powtórz, nieznany identyfikator komponentu

<h:form id="form1" prependId=false> 
    <h:panelGroup id="panel1"> 
     <h:dataTable/> 
     <ui:repeat value="#{bean.page}" var="page"> 
      <h:commandLink value="#{page}"> 
       <f:ajax execute="@form" render="panel1" listener="#{bean.page}" /> 
      </h:commandLink> 
     </ui:repeat> 
    </h:panelGroup>  
</h:form> 

Po wypróbowaniu tego kodu, daje nieznany panel id1. Próbowałem też z identyfikatorem ": panel1". Otrzymuję ten sam błąd.

+0

Dlaczego edytować kod, aby przesunąć ' na drugi koniec? – BalusC

+0

Ui: repeat znajduje się wewnątrz grupy panel. Musiałem więc przejść na drugi koniec. – user679526

+0

OK, będę edytować fragment kodu również w mojej odpowiedzi. Ale techniczna odpowiedź pozostaje niezmienna. – BalusC

Odpowiedz

19

Względny identyfikator klienta (tj. Nie rozpoczynający się od :) jest względny względem bieżącego elementu macierzystego NamingContainer. Model <ui:repeat> jest również dostępny w wersji NamingContainer. Tak więc render="panel1" szuka komponentu w kontekście <ui:repeat>. To nie zadziała. Bezwzględny identyfikator klienta (rozpoczynający się od :) szuka składnika w kontekście widoku głównego. Ale masz go wewnątrz <h:form> - który jest z kolei kolejnym komponentem NamingContainer, więc render=":panel" również nie zadziała.

następujące powinny pracować z prependId="false" usunięte tak, że można odnieść go:

<h:form id="form1"> 
    <h:panelGroup id="panel1"> 
    <h:dataTable/> 

    <ui:repeat value="#{bean.page}" var="page"> 
     <h:commandLink value="#{page}"> 
     <f:ajax execute="@form" render=":form1:panel1" listener="#{bean.page}" /> 
     </h:commandLink> 
    </ui:repeat> 
    </h:panelGroup> 
</h:form> 

Nawiasem mówiąc, jeśli faktycznie chcą uczynić tylko tabeli, to należy to robić :

<h:form id="form1"> 
    <h:panelGroup> 
    <h:dataTable id="table1" /> 

    <ui:repeat value="#{bean.page}" var="page"> 
     <h:commandLink value="#{page}"> 
     <f:ajax execute="@form" render=":form1:table1" listener="#{bean.page}" /> 
     </h:commandLink> 
    </ui:repeat> 
    </h:panelGroup> 
</h:form> 

Aktualizacja: jak na komentarze, okazuje się, że zmieniłeś domyślny znak JSF NamingContainer z : na _ według konfiguracji. W takim przypadku musisz użyć _ zamiast : w selektorze identyfikatora klienta.

<f:ajax execute="@form" render="_form1_panel1" listener="#{bean.page}" /> 
+0

Usunąłem prependId = "false" dla znacznika formularza. Dostaję wyjątek, javax.faces.FacesException: zawiera nieznany identyfikator ': form1: panel1' - nie może zlokalizować go w kontekście komponentu j_idt228. – user679526

+0

Wtedy '' samo w sobie znajduje się prawdopodobnie w innym komponencie 'NamingContainer'. Kliknij prawym przyciskiem myszy w przeglądarce, wykonaj * View Source * i zlokalizuj ' i użyj dokładnie tego identyfikatora z przedrostkiem': '. – BalusC

+0

znajduje się w . Czy istnieje sposób, aby dowiedzieć się, w którym kontenerie nazw znajduje się? – user679526

0
<ui:repeat value="#{interaction.interactionListBean}" var="interactionItr"> 

    <h:commandLink value="#{interactionItr.interactionDate}" styleClass="#{interaction.createImage}" style="margin:0 5px 5px 0!important; display:inline-block;"><br/> 
     <f:ajax render=":formId:interactionDate :formId:category :formId:activity :formId:status :formId:channel :formId:status1 :formId:caseId :formId:comment :formId:user1 :formId:team :formId:user :formId:transit " 
        listener="#{interactionController.interactionDetailGet}"/> 
     <f:param name="RefId" value="#{interaction.interactionRefId}"/> 
    </h:commandLink> 

</ui:repeat> 

Problem: patrz wyżej z powyższym kodzie ich nie jest wyjątkiem na konsoli ale listerner ajax nie wywoła kiedy zobaczyłem tego posta similiar rodzaju koncepcji będącej użytku tylko byłem Umieścić exceute = "@form" to mój kodowania działa poprawnie

rozwiązanie:

execute="@form"

Powiązane problemy