2009-07-15 2 views
1

Ich weiß, das sieht aus wie eine Menge Text, aber ich denke, es ist ein ziemlich einfaches Konzept, das ich vermisse.Warum wird meine Variable "Facelets loop" nicht aus dem Gültigkeitsbereich entfernt?

Ich schreibe eine Webanwendung mit Facelets. Ich habe ein benutzerdefiniertes Tag rq: request-list, das eine Liste von Anfragen als Parameter akzeptiert und eine schöne Tabelle ausgibt, um sie anzuzeigen. So weit, ist es gut.

rq: Anfrage-Liste beginnt wie man es erwarten würde:

<!-- ... --> 
<ice:dataTable value="#{list}" var="req"> 
    <ice:column> 
     <f:facet name="header">Date last edited</f:facet> 
     <ice:outputText value="#{req.dateModified}" /> 
    </ice:column> 
<!-- ... --> 

Und das dann auch ganz gut aus. Es hat sogar einen Link in der Tabelle, um die Anfrage zu bearbeiten. Hurra!

<ice:column rendered="#{spokespersonView}"> 
    <f:facet name="header">Edit</f:facet> 
    <h:commandLink value="Edit" action="edit_r" rendered="#{RequestSessionBean.mutable}"> 
     <f:setPropertyActionListener target="#{RequestSessionBean.request}" value="#{req}"/> 
    </h:commandLink> 
</ice:column> 

, die uns in die Bearbeitungsseite erfolgt, nachdem die Anforderung in der Backing Bean auf den von der Tabellenzeile dargestellt Einstellung an wir sind. Hier liegt das Problem. Und es ist subtil.

rq: Anforderungsliste wird mehrmals auf einer Seite verwendet; als solche:

<ui:repeat value="#{ExperimentListBean.usersExperiments}" var="exp"> 
    <rq:request-list list="#{RequestListBean.requestsByExperiment[exp]}" showExperiment="false" spokespersonView="true" /> 
</ui:repeat> 

Nun werden die Tabellen OK erscheinen; das heißt, der ganze Text ist richtig. Die commandLinks verweisen jedoch auf die falschen Requests ... sie verweisen auf die Anfrage der entsprechenden Zeile der letzten rq: request-Liste auf der Seite. Die Daten, die zu den Anforderungen gehören, werden ausgegeben, wie sie in der Tabelle sein sollten, aber {req} zeigt auf die falsche Anforderung, wenn es darum geht, auf einen Befehls-Link zu klicken.

Um es zu wiederholen, wenn ich ein paar rq: request-Listen auf einer Seite, auf den Link Bearbeiten für die erste Reihe von all rq: Anfrage-Liste zeigt auf die erste Anfrage (Zeile) in dem letzten rq: Anforderungsliste auf der Seite. Der Link Bearbeiten für die zweite Zeile von alle rq: request-list zeigt auf die zweite Anfrage (Zeile) der letzten rq: request-Liste auf der Seite. Usw.

Wie kann ich {req} auf das hinweisen, was ich war, und nicht nur ein Index in einer Liste sein, die veraltet ist?

Danke!

Antwort

1

Werfen Sie einen Blick auf this blog entry, verwenden Sie wahrscheinlich wiederholen, die einmal ausgeführt wird, wenn der Komponentenbaum erstellt wird, anstelle von foreach, die zur Renderzeit ausgewertet werden. (Aber das ist nur ein Schuss im Dunkeln, ich habe Ihr Beispiel nicht versucht)

+0

Es hat funktioniert! Vielen Dank! Ich bin noch neu in Java Web-Programmierung; Ich dachte, dass c: forEach nur einmal ausgeführt wurde und ui: repeat wurde jedes Mal ausgeführt. Aber diese Seite posten nicht zurück zu sich selbst, also sehe ich nicht, warum es in irgendeiner Weise wichtig wäre. Wie auch immer, es funktioniert, also danke! – Nick

Verwandte Themen