Domino 9 und frühere Versionen > ND8: Entwicklung - XPages
Repeat Control von außen zugreifen?
Flachmann:
Hallo!
Als XPage-Neuling habe ich hier viele Tipps gefunden. Vielen Dank für dieses tolle Forum! :D
Z.Z. hänge ich an folgendem Probem (R8.5.3), denke, dass ich einfach nur einen Denkfehler habe, finde aber keine Lösung.
In einer Repeat Control zeige ich Labels und Felder an, die aus einem Dokuments ermittelt werden. Welche Felder bzw. welcher Bereich angezeigt werden sollen, gestimmt der Benutzer über eine Radio Button Control oberhalb des Repeat Controls. Im Notes-Dokument heißen die Felder quasi "Bereich_Index_Feld". D.h.aus dem Radio Button Control ermittle ich den gewünschten Bereich, index ist einfach der Index des Repeat Controlss. Die Anzahl der Felder pro Bereich ist unterschiedlich, und mit einem Repeat Control lässt sich das wunderbar lösen.
Die Labels und Felder sind nicht mit Simple data binding mit dem Dokument verknüpft, sondern werden "dynamisch berechnet", in etwa so: defaultValue="#{javascript:doc.getItemValueString(sessionScope.Bereich + '_' + rowIdx + '_Feld')}". Das ganze funktioniert soweit sehr gut.
Mein Problem ist, dass ich nach einem Wechsel des Bereichs der defaultValue nicht mehr berechnet wird. Mein Radio Button Control oberhalb des Repeats löst zwar einen onchange-Event aus, der die Variable sessionScope.Bereich setzt, die Seite berechnet sich auch, nur die Feldwerte werden nicht mehr neu ermittelt. D.h. die Felderwerte enthalten die erfassten Daten eines zuvor bearbeiteten Bereichs.
Ist eigentlich logisch, denn die Felder sind ja nicht gebunden und defaultValue wird nicht ausgeführt, weil ja schon Werte vorhanden sind. Es würde vielleicht schon genügen, wenn man dynamisch auf eine viewScope- oder requestScope-Variable zugreifen könnte, aber da bin ich mit meinem Latein am Ende, zumal wohl auch keine Änderung des Bindings möglich scheint.
Im klassischen Notes würde man sich wahrscheinlich an den Onchange-Event des Radio Buttons hängen und die Tabelle darunter füllen. Aber in einem Repeat Control komme ich so ohne weiteres nicht an die einzelnen Felder.
Danke für jeglichen Vorschlag!
Flachmann:
Habe auch diesen Vorschlag gefunden: http://atnotes.de/index.php/topic,52383.0.html, der recht vielversprechend aussah. Statt an ein Feld will ich einfach an eine Scoped Variable binden.
Dachte, dass ich ein Hidden Input Control verwende, dessen Wert geeignet berechnet wird und dann an eine Scoped Variable gebunden wird. Auf die könnte ich dann auch "von außen" zugreifen. In der Wiederholung des Repeat Controls:
<xp:repeat id="repeat1" rows="40" first="0" var="rowData"
indexVar="rowIdx" value="#{javascript:sessionScope.Bereiche}">
gibt es also ein Hidden Input namens "hiddenResult":
<xp:inputHidden id="hiddenResult"
value="${javascript:return '#{viewScope.' + sessionScope.Bereich + '_' + BuildIndexNo(rowData) + '_Result}'}">
</xp:inputHidden>
(BuildIndexNo() formatiert nur den Wert in rowData passend)
Putzigerweise erhalte ich die Fehlermeldung
--- Zitat ---Error while executing JavaScript computed expression
Script interpreter error, line=1, col=71: [ReferenceError] 'rowData' not found
--- Ende Zitat ---
In den anderen Feldern des Repeat Controls ist rowData allerdings bekannt und kann referenziert werden.
ata:
... wenn ich das so auf die schnelle sehe, dann hast du an deiner Stelle ClientSideJS - und da gibt es kein rowData...
Flachmann:
Hallo Toni!
An der Stelle kann mal kein ClientSideJS eingeben. Das Problem mit den rowData hat sich allerdings inzwischen geklärt: es fehlte repeatControls="true". Doof. :(
Z.Z. versuche ich die Variablen an requestScope-Variablen zu binden, d.h. ich lese beim Öffnen des Dokuments meine Felder und merke mir die Werte:
requestScope.put('repeat_' + curIdx + '_Feld',
doc.getItemValue(sessionScope.Bereich + '_' + curIdx + '_Feld'));
Für die Felder im Repeat Control habe ich unter Data Binding, JavaScript eingegeben:
return '#{requestScope.repeat_' + BuildIndexNo(rowData) + '_Feld}'.
Das müsste doch funktionieren, oder? Tut es aber nicht. Nach dem Laden sind die requestScope-Variablen gesetzt, aber die Felder sind nicht korrekt gebunden. Ich bin echt ratlos! :-:
Jens Winkelmann:
Wenn ich es richtig verstanden habe, willst du folgendes machen:
Der Benutzer soll eine XPage öffnen.
Dort kann er anklicken welche Felder er eingeben möchte. Im Beispiel welche Sprachen er haben möchte.
Je nach Auswahl des Benutzers sollen die entsprechenden Felder angezeigt werden oder nicht.
Beim Speichern sollen dann nur die Werte der ausgewählten Sprachen in den zugehörigen Feldern gespeichert werden.
Meine Lösung http://atnotes.de/index.php/topic,52383.0.html klappt für diese Anforderung nicht.
Grund: Das dynamische Anbinden von Feldern klappt nur beim Laden der XPage.
Also nur bei Compute on Page Load ($) und nicht bei Compute Dynamically (#)
Da der Benutzer aber nach dem Öffnen der XPage seine Auswahl trifft, kann das Repeat nicht mehr die gewünschten Felder generieren.
Ich würde es also so machen.
Nachfolgend habe ich mein Beispiel erweitert:
1) Beim beforePageLoad Event speicher ich alle Sprachen in ViewScope Variablen
2) Mit einer checkBoxGroup kann der Benutzer die gewünschten Sprachen auswählen
3) Beim onchange Event wird das Repeat Control refreshed
4) Das Repeat-Control generiert immer alle Sprachen
5) Über ein Span werden aber nur die Sprachen angezeigt, die der Benutzer auch gewählt hat.
--- Code: ---<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1"></xp:dominoDocument>
</xp:this.data>
<xp:this.beforePageLoad><![CDATA[#{javascript:var languages:java.util.Vector = @Explode("de,en,pl",",");
viewScope.put("allLanguages",languages);
viewScope.put("selectedLanguages", languages)}]]></xp:this.beforePageLoad>
<xp:checkBoxGroup id="checkBoxGroup1"
value="#{viewScope.selectedLanguages}">
<xp:this.defaultValue><![CDATA[#{javascript:return viewScope.get( "allLanguages" );}]]></xp:this.defaultValue>
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="repeat1">
<xp:this.action><![CDATA[#{javascript:// partial update}]]></xp:this.action>
</xp:eventHandler>
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:return viewScope.get( "allLanguages" );}]]></xp:this.value>
</xp:selectItems>
</xp:checkBoxGroup>
<xp:repeat id="repeat1" rows="30" var="varcollection"
repeatControls="true">
<xp:this.value><![CDATA[#{javascript:return viewScope.get( "allLanguages" );}]]></xp:this.value>
<xp:span>
<xp:this.rendered><![CDATA[#{javascript:var vec:java.util.Vector = viewScope.get( "selectedLanguages" );
return @IsMember(varcollection,vec);
}]]></xp:this.rendered>
<xp:label id="label1">
<xp:this.value><![CDATA[#{javascript:return varcollection + ": ";}]]></xp:this.value>
</xp:label>
<xp:inputText id="inputText1" loaded="true">
<xp:this.value><![CDATA[${javascript:var fieldName = "Help_" + varcollection;
return '#{currentDocument.' + fieldName + '}';}]]></xp:this.value>
</xp:inputText>
<xp:br></xp:br>
</xp:span>
</xp:repeat>
<xp:button
value="Submit"
id="button1">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="false" save="true"></xp:eventHandler></xp:button>
</xp:view>
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln