Das ist der dritte Teil der Serie “Domino Datasources On-the-Fly”. Der zweite Teil findet sich hier.
Will man eine Wertezuweisung berechnen lassen, muss ein ValueBinding erstellt werden. Damit lässt sich dann z.B. der Formname eines DominoDocumentData-Objektes berechnen (zugegebenermaßen ein kleinwenig sinnlos, da man dies im Code sowieso erledigen könnte…).
Hierfür existiert die Methode createValueBinding() der Application-Klasse, mit der ein neues ValueBinding-Objekt instanziert werden kann:
var app = facesContext.getApplication(); var vb = app.createValueBinding("#{javascript:@Text(@Now())}");
Dieses ValueBinding muss dem jeweiligen Datasource-Objekt über die Methode setValueBinding() zugewiesen werden. Als erster Parameter muss der Name der zu setzenden Eigenschaft angegeben werden, dann folgt das jeweilige ValueBinding-Objekt.
var data = new com.ibm.xsp.model.domino.DominoDocumentData(); data.setVar("document1"); data.setValueBinding("formName", vb); view.addData(data);
Die Fett hervorgehobene Eigenschaft entspricht dem Parameter im XPages Source:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:this.data> <xp:dominoDocument var="document1" formName="#{javascript:@Text(@Now())}" /> </xp:this.data> </xp:view>
Allerdings ist diese Zuweisung nicht bei allen Eigenschaften möglich! Bei noch auszuführenden Methoden wie z.B. dem QuerySaveDocument-Event muss stattdessen mit einem MethodBinding-Objekt gearbeitet werden. Wieder findet die Instanzierung über das Application-Objekt statt:
var code = ""; code += "#{javascript:document1.replaceItemValue(\"Test\""; code += ", @Text(@Now()));}"; var mb = app.createMethodBinding( code, null);
Eine Methode setMethodBinding() existiert jedoch nicht; das MethodBinding-Objekt muss daher über spezielle Methoden dem jeweiligen DataSource-Objektes zugewiesen werden. Die Namensgebung der Methoden ist hierbei jedoch trivial, es muss nur ein „set“ vor die jeweilige Methode gestellt werden:
var data = new com.ibm.xsp.model.domino.DominoDocumentData(); data.setVar("document1"); data.setQuerySaveDocument(mb); view.addData(data);
Hier noch der Source einer vollständigen Beispiel-Implementierung:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:button value="Create Datasource" id="button1"> <xp:eventHandler event="onclick" submit="true" refreshMode="complete"> <xp:this.action> <![CDATA[#{javascript: var app = facesContext.getApplication(); var data = new com.ibm.xsp.model.domino.DominoDocumentData(); data.setVar("document1"); var value = "#{javascript:@Text(@Now())}"; var vb = app.createValueBinding(value); data.setValueBinding("formName", vb); var code = ""; code += "#{javascript:document1.replaceItemValue(\"Test\""; code += ", @Text(@Now()));}"; var mb = app.createMethodBinding( code, null); data.setQuerySaveDocument(mb); view.addData(data); }]]> </xp:this.action> </xp:eventHandler> </xp:button> <xp:button value="Use Datasource" id="button2"> <xp:eventHandler event="onclick" submit="true" refreshMode="complete"> <xp:this.action> <xp:actionGroup> <xp:executeScript> <xp:this.script> <![CDATA[#{javascript: document1.setValue("Feld", "ABC"); }]]> </xp:this.script> </xp:executeScript> <xp:saveDocument var="document1" /> </xp:actionGroup> </xp:this.action> </xp:eventHandler> </xp:button> </xp:view>
If yo set the querysave this way does that replace any other querysave routines or is it like the dojo.addonload function ?
It will replace the existing querysave routine only.
Pingback: Domino Datasources On-the-Fly (2): DominoDataView | blog@hasselba.ch