2013-04-17 21 views
10

SytuacjaNiewłaściwy JSF 2 ID Chaining

JavaServer Faces

wersja: 2.1.6

Mam komponent kompozytowy rodzica z dwóch zagnieżdżonych cc. Jedna z nich zawiera grupę HtmlPanelGroup, która ma powiązanie z komponentem. Używam tego wiązania do programowego dodawania obiektów HtmlCommandLink do grupy HtmlPanelG.

Nazwijmy jakieś identyfikatory:

  • dominującej za cc dominującej
  • CHILD_FIRST na pierwsze dziecko cc, zagnieżdżone w RODZICA
  • CHILD_SECOND na drugie dziecko cc, zagnieżdżone w RODZICA
  • GROUP dla grupy Panel, zagnieżdżonej w CHILD_SECOND
  • LINK_1 dla pierwszego obiektu HtmlCommandLink, programowo dodanego do grupy

Oczekiwanie

Spodziewam następujące ID Chaining (z domyślnym javax.faces.SEPARATOR_CHAR):

PARENT (Composite Component, declarative) 
    PARENT:CHILD_FIRST (Composite Component, declarative) 
    PARENT:CHILD_SECOND (Component Component, declarative) 
    PARENT:CHILD_SECOND:GROUP (HtmlPanelGroup, declarative) 
     PARENT:CHILD_SECOND:GROUP:LINK_1 (HtmlCommandLink, programmatically) 

Problem

Identyfikator HtmlCommandLink-Object jest źle na pierwszej stronie. Zamiast "PARENT: CHILD_SECOND: GROUP: LINK_1" identyfikator to tylko "CHILD_SECOND: GROUP: LINK_1". Po odświeżeniu strony identyfikator jest prawidłowy "PARENT: CHILD_SECOND: GROUP: LINK_1". W rzeczywistości w każdym komponencie drugiego komponentu kompozytowego ("CHILD_SECOND") brakuje pierwszej części identyfikatora ("PARENT"). Po odświeżeniu wszystkie identyfikatory są poprawne.

Rozwiązanie

mogę automatycznie odświeżyć stronę po pierwszej wizycie. Ale nie chcę.

+5

Trudno jest mi zrozumieć konkretny problem, ponieważ 'HtmlPanelGroup' nie jest komponentem' NamingContainer' i dlatego nie powinien poprzedzać swojego identyfikatora komendą "link children". Nie powinieneś widzieć "GROUP:" w identyfikatorze dzieci z łączem poleceń w ogóle. Prawdziwa SSCCE ogromnie pomogłaby w lepszym zrozumieniu konkretnego problemu. – BalusC

+0

Dlaczego, na litość boską, to pytanie ma 10 przegranych? Pytanie jest w aktualnej formie bez ważnej SSCCE, która nie ma żadnego sensu, a zatem nie odpowiada. Szkoda, że ​​nie mogę ponownie oddać wygasłego głosowania zamkniętego. – BalusC

+0

@Bluasc Myślę, że masz rację, trudno jest zorientować się, że aktualna grupa PanelGroup zawiera składnik lub nie. – Sheel

Odpowiedz

-1

Identyfikator id po zinterpretowaniu przez przeglądarkę nie odpowiada temu, co myślisz. o ile mi wiadomo, nie przekracza 3 poziomów. Na przykład:

<h:form id="form"> 
    <h:panel id="panel"> 
     <h:panel id="panel1"> 
      <h:label id="lab"/> 
     </h:panel> 
     <h:panel id="panel2"> 
     </h:panel>  
    </h:panel> 
</h:form> 

to identyfikator etykiety nie będzie postaci: panel: panel1: laboratorium, ale forma: panel: laboratorium. jeśli widget, dla którego chcesz uzyskać identyfikator, jest głębszy, nie mogę powiedzieć, ale nie przekroczy on 3 poziomów. Mogę ci powiedzieć, jak znaleźć identyfikator. można po prostu napisać stronę, a następnie wyświetlić ją na chrome lub firefox, gdzie można zobaczyć kod źródłowy po zinterpretowaniu. aby uzyskać żądany identyfikator.

powodzenia!

+1

Dlaczego na ziemi ta odpowiedź została przegłosowana? Oświadczenie * "o ile mi wiadomo, że nie przekracza 3 poziomów" * jest czystym nonsensem. Powiązane materiały do ​​nauki: http://stackoverflow.com/questions/8634156/how-to-reference-components-in-jsf-ajax-cannot-find-component-with-identifier/8644762#8644762 Zwróć uwagę, że '' jest ** nie ** "NamingContainer". Twoje stwierdzenie, że ': panel' będzie obecne w identyfikatorze klienta' 'jest zatem kolejnym czystym nonsensem. – BalusC