2010-08-10 14 views
7

Ich habe ein Problem mit doppelten IDs in meiner JSF-App. Ich habe in this post gelesen, dass eine der möglichen Lösungen ist Benennung Container zu verwenden. Kannst du mir ein Beispiel geben, wie man den Namenscontainer benutzt, um doppelte Probleme zu vermeiden? Ich benutze Facelets.Jsf Erstellen eines Namenscontainers

Antwort

12

Dies ist, was für mich gearbeitet JSF1.2 und facelets mit:

Ich entdecken, dass weder <ui:composition> noch <ui:component> tatsächlich ein Namenscontainer ist, so dass mehr die gleiche Komponente als einmal in der gleichen Form mit einem versagen doppelte ID-Ausnahme Dies scheint ein schlechtes Design zu sein, da der Hauptpunkt der Komponenten die Wiederverwendbarkeit ist. Um das zu umgehen dieses Problem umfassen ich eine <f:subview> innerhalb jeder Komponente und stellen Sie die ID auf sie als Parameter meiner Komponente tag:

myComponent.xhtml:

<ui:component>  
    <f:subview id="#{id}"> 
     ....component code 
    </f:subview> 
</ui:component> 

und die es auf anderen Seiten verwenden ist einfach (nach dem Einrichten von taglib.xml und web.xml korrekt):

<myTagLib:myComponent id="myCompA" /> 
+0

Das löst mein Problem perfekt. Danke an euch Naganalf und BalusC! – mgamer

+1

Entschuldigung für Down-Voting, aber f: Subview scheint nicht dazu gedacht, das Problem zu beheben beschrieben in der Entsendung OP erwähnt. Das tut etwas und etwas könnte funktionieren. – Toskan

4

Ich schlage vor, einen Schritt zurück und untersuchen warum das doppelte ID-Problem auftritt. Sobald Sie die Ursache beseitigt haben, reparieren Sie sie einfach auf die "übliche" Art und Weise, anstatt Ihre eigene UINamingContainer Komponente zu erstellen.

Es gibt mehrere mögliche Ursachen für doppelte ID Fehler, die Sie weiter es nach unten nageln helfen sollte:

  • Die gleiche ID auf verschiedenenUIComponent s innerhalb des gleichenUINamingContainer Komponente verwendet wird.
  • Physikalisch unterschiedliche Komponenten sind gebunden an die gleichenUIComponent Eigenschaft der gleichen Bohne.
  • Nur JSP: die f:subview ist in der übergeordnet Seite anstelle der enthalten Seite.
  • The gleichen enthalten Seite mehr mal in der gleichenUINamingContainer Komponente enthalten ist.
  • Eine Komponente wurde dynamisch aufgebaut (z. B. new UIComponent()) ohne mit einer zugewiesenen ID.

Hier ist UINamingContainer jeweils unter der <h:form>, <h:dataTable> und <f:subview>.

Wenn die oben genannten Vorschläge nicht helfen, dann aktualisieren Sie Ihre Frage eines möglichst kleinen Code-Schnipsel enthalten (also ohne alle irrelevant Code/Krempel wie unabhängige Komponenten, Bibliotheken, HTML/CSS/JS/etc), das reproduziert das exakt gleiche Problem, indem es einfach kopiert und nicht ohne Änderungen läuft.

+1

Dies ist genau wie das vorletzte Szenario. Ich habe eine facelets benutzerdefinierte Komponente, die ich mehrmals auf der gleichen Seite einschließen. Meine Facelets-Komponente enthält a4j: outputPanel mit der problematischen ID. Ich brauche diese ID, damit ich das a4j: outputPanel erneut verwenden kann. Wrapping meiner Komponente Inhalte in h: Form scheint mir nicht wie eine gute Option. Ich würde es lieber in ein paar Facelets einfügen - vorausgesetzt, UINamingContainer, aber ich denke, dass es so etwas nicht gibt. – mgamer

+1

JSF 1.x oder 2.x? Wo rufen Sie den Rerender innerhalb oder außerhalb der benutzerdefinierten Komponente auf? Was genau meinst du mit "benutzerdefinierte Komponente", nur "ui: Komposition"? – BalusC

+0

Ich habe gerade das gleiche Problem beim Erstellen meiner ersten Facelets-Komponenten. Ich werde teilen, was für mich in einer anderen Antwort funktionierte (wenn ich vom Mittagessen zurückkomme). Vielleicht möchten Sie Ihre Frage aktualisieren, um genauer zu sein. – Naganalf

Verwandte Themen