UIForm mit prependId="false" breaks <f:ajax render>

Ich habe eine Frage über die Idee hinter der Tatsache, dass nur UIForm bekam das Attribut prependId. Warum ist das Attribut nicht angegeben ist in der NamingContainer - Schnittstelle? Sie werden jetzt wahrscheinlich sagen, dass wegen der rückwärts-Kompatibilität, aber ich würde am Liebsten mit Bruch der Kompatibilität und ermöglichen den Benutzern die Implementierung dieser Schnittstelle, implementieren auch die Methoden für die prependId Sache.

Das Hauptproblem aus meiner Sicht über die prependId in der UIForm Komponente ist, dass es brechen wird findComponent()
Ich würde erwarten, dass wenn ich prependId, dann die NamingContainer Verhalten ändern würde, nicht nur in Bezug auf das rendering, sondern auch, wenn zu wollen, um die Suche für die Komponenten in der Komponentenstruktur.

Hier ein einfaches Beispiel:

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>

Nun, wenn ich will, um die panelGroup-Komponente würde ich erwarten, übergeben Sie die Zeichenfolge "group" an die Methode findComponent() aber nicht finden, alles, was, die ich habe zu verwenden "test:group" statt.

Dem konkreten problem mit diesem ist, bei der Verwendung von ajax mit prependId="false". Die ajax-tag erwartet in dem Attribute und update-Prozess, dass die Werte, die Pflege der naming-Container. Es ist ein bisschen komisch, dass wenn ich prependId="false" dass ich haben Sie den vollen id oder Pfad, aber okay.

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>
<h:form id="test1" prependId="false">
  <h:commandButton value="go">
    <f:ajax render="test:group"/>
  </h:commandButton>
</h:form>

Gut dieser code wird gerendert ohne Probleme, aber es wird nicht aktualisieren Sie die panelGroup, weil es ihn nicht finden kann. Die PartialViewContext enthalten nur die id "group" als element der renderIds. Ich weiß nicht, ob dies zu erwarten ist, wahrscheinlich ist es aber ich weiß nicht, den code. Nun kommen wir zu dem Punkt, wo die Methode findComponent() nicht finden können, die Komponente, da der Ausdruck als parameter übergeben wird "group" wo die Methode erwarten würde "test:group" die Komponente finden.

Ist eine Lösung, um schreiben Sie Ihre eigenen findComponent() das ist der Weg, den ich wählte, um mit diesem problem umzugehen. In dieser Methode umgehe ich eine Komponente, die eine NamingContainer und hat die Eigenschaft, prependId auf false gesetzt, wie eine normale UIComponent. Ich werde zu tun haben, dass für jeden UIComponent bietet eine prependId-Attribut und das ist schlecht. Reflexion wird helfen, um die statische definition von Arten, aber es ist immer noch keine wirklich saubere Lösung.

Die andere Möglichkeit wäre die Einführung der prependId Attribut in der NamingContainer - Schnittstelle und ändern Sie das Verhalten der findComponent() zu arbeiten wie oben beschrieben.

Den letzten vorgeschlagene Lösung wäre eine änderung des Verhaltens der ajax-tag zu übergeben, die ganze id, aber das wäre nur lösen, die ajax-Problem ist und nicht die programmatische Probleme, die hinter der findComponent() Umsetzung.

Was haltet Ihr davon und warum zum Teufel ist es implementiert, wie das? Ich kann nicht der erste mit diesem problem, aber ich war nicht in der Lage, finden Sie Verwandte Themen?!

Ein schöner Fall von einem Programmierer, der wirklich weiß, wie Sie Dinge enthüllen. Danke Christian.

InformationsquelleAutor Christian Beikov | 2011-09-14

Schreibe einen Kommentar