Autor Thema: Repeat Control von außen zugreifen?  (Gelesen 4106 mal)

Offline Flachmann

  • Senior Mitglied
  • ****
  • Beiträge: 284
  • Geschlecht: Männlich
  • Mal wieder: Flachmann ist Schuld!
Repeat Control von außen zugreifen?
« am: 04.06.12 - 12:23:52 »
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!
« Letzte Änderung: 04.06.12 - 14:02:27 von Flachmann »
Gruß,
  __________
  _/_
  /lachmann

Offline Flachmann

  • Senior Mitglied
  • ****
  • Beiträge: 284
  • Geschlecht: Männlich
  • Mal wieder: Flachmann ist Schuld!
Re: Repeat Control von außen zugreifen?
« Antwort #1 am: 04.06.12 - 14:01:49 »
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

In den anderen Feldern des Repeat Controls ist rowData allerdings bekannt und kann referenziert werden.
« Letzte Änderung: 04.06.12 - 14:50:48 von Flachmann »
Gruß,
  __________
  _/_
  /lachmann

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Repeat Control von außen zugreifen?
« Antwort #2 am: 04.06.12 - 16:14:41 »
... wenn ich das so auf die schnelle sehe, dann hast du an deiner Stelle ClientSideJS - und da gibt es kein rowData...
Grüßle Toni :)

Offline Flachmann

  • Senior Mitglied
  • ****
  • Beiträge: 284
  • Geschlecht: Männlich
  • Mal wieder: Flachmann ist Schuld!
Re: Repeat Control von außen zugreifen?
« Antwort #3 am: 04.06.12 - 16:31:20 »
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!  :-:

« Letzte Änderung: 04.06.12 - 17:41:09 von Flachmann »
Gruß,
  __________
  _/_
  /lachmann

Offline Jens Winkelmann

  • Junior Mitglied
  • **
  • Beiträge: 53
  • Geschlecht: Männlich
  • Jens Winkelmann
    • PAVONE AG
Re: Repeat Control von außen zugreifen?
« Antwort #4 am: 06.06.12 - 19:05:26 »
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>

Offline Flachmann

  • Senior Mitglied
  • ****
  • Beiträge: 284
  • Geschlecht: Männlich
  • Mal wieder: Flachmann ist Schuld!
Re: Repeat Control von außen zugreifen?
« Antwort #5 am: 12.06.12 - 07:24:55 »
Hallo Jens!

Vielen Dank, Du hast mir sehr geholfen. Im Prinzip hast Du Recht, es ging zwar nicht um Sprachen, sondern um "Bereiche", aber das ist ja letztlich, technisch gesehen, egal.  :)

Ich habe das nun so umgesetzt, dass ich "Deine" dynamische JavaScript-Bind-Technik verwende. Beim Bereichswechsel rufe ich im onChange-Event die selbe xPage wieder auf. Dadurch wird natürlich das Binding neu ausgeführt, nun aber für die Repeat-Werte des neuen Bereichs. Das funktioniert bestens, auch wenn es vielleicht etwas mehr Aufwand für den Server bedeutet

xPages sind noch so neu für mich, ich denke immer noch viel zu sehr in klassischem Notes. Und da geht halt vieles anders.  :P

Darum noch einmal ganz herzlichen Dank!
  Thomas
Gruß,
  __________
  _/_
  /lachmann

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz