Okay, ich habe da was gefunden:
Und zwar Callbacks.
Dafür verwende ich grundsätzlich den Dialogaufruf von Jeremy Hodges: http://xpagesblog.com/XPagesHome.nsf/Entry.xsp?documentId=9BB0002FE3452618852578CB0066AB75
Diesen habe ich um Callbacks erweitert, wie bei dem "Confirm"-Dialog von Mark Leusink: http://www.bleedyellow.com/blogs/m.leusink/entry/dojo_style_confirm_dialogs_in_xpages?lang=en
Und auch noch erweitert um eine Funktion zum Definieren der Callback-Funktion, analog zu Sven Hasselbachs "Schließen verhindern"-Trick: http://hasselba.ch/blog/?p=262
Das Ergebnis sieht so aus:
dojo.provide('com.ZetaOne.widget.Dialog');
dojo.require('dijit.Dialog');
(function(){
dojo.declare("com.ZetaOne.widget.Dialog", dijit.Dialog, {
callBack: null,
setCallBack: function(fct)
{
this.callBack = fct
},
onHide: function(){
if (this.callBack != null) { this.callBack(); }
},
postCreate: function(){
this.inherited(arguments);
dojo.query('form', dojo.body())[0].appendChild(this.domNode);
},
_setup: function() {
this.inherited(arguments);
if (this.domNode.parentNode.nodeName.toLowerCase() == 'body')
dojo.query('form', dojo.body())[0].appendChild(this.domNode);
}
})
}());
... und wird in einem Button wie folgt aufgerufen:
var myFunction = function() {
var result = document.getElementById('#{javascript:getClientId("fldTestReturn")}').value;
alert("Gewählter Wert ist: " + result);
};
var dlg = dijit.byId('#{javascript:getClientId("PicklistTest")}');
dlg.setCallBack(myFunction);
dlg.show();
Ich schreibe die Auswahl meiner Picklist in ein Feld (und refreshe dieses) und schließe ich den Dialog mittels ".hide()". Ist eine Callback-Funktion angegeben, dann wird diese ausgeführt und kann direkt auf den Wert zugreifen.
Ich glaube das geht schonmal in die richtige Richtung, muss ich aber noch genauer in Augenschein nehmen.
Soweit,
Mitch
In einem Klick, so wie man das aus dem guten, alten LotusScript kennt.
Hmm, also ich kenn da jetzt keine Möglichkeit, das mit "einem Klick" in LotusScript zu realisieren, das sind m.W. immer ein paar Zeilen Code, die die Schritte 1-4 abbilden. Nur halt in einem CodeBlock, die den gesamten Client lahmlegen, wenn die Picklist oder der Dialog geöffnet ist. ;D
Funktioniert. Aber es fühlt sich sehr nach "von Hinten mit der Faust durchs Auge" an. Ich mag es nicht. Es ist viel zu kompliziert für eine eigentlich so simple Anforderung.
Welche Anforderung außer das Öffnen eines NamePickers ist denn nicht kompliziert umzusetzen im Notes Client? ???
Oder fährt man mit XPages/Webentwicklung ganz anders?
Grunsätzlich nicht. Denn ob man nun im NotesClient arbeitet, oder im Web: Der einzige Unterschied ist eine "echte" Trennung zwischen Frontend und Backend. Das, was man mit UI-Klassen und Backend-Klassen im LotusScript vorfindet, ist hier halt einzuhalten - ein Mix wie bei reiner Client-Entwicklung ist nicht möglich (sehr, sehr stark vereinfacht dargestellt). Das ist zwar aufwendiger, aber sauberer und daher fehlertoleranter.
(falls ja: Wie)
Gerade hier gibt es etliche Lösungsvarianten. Ich würde das ganze so lösen:
1.
Dem CC eine zusätzliche Eigenschaft verpassen, nennen wir sie onCloseExec. Die wird als Method-Binding definiert (Typ: javax.faces.el.MethodBinding)
2.
Diesen Code kann man im EventHandler des Buttons ausführen. Hier der SSJS Code dazu:
compositeData.onCloseExec.invoke( facesContext, null );
3. Dann die Eigenschaft in der jew. XPage mit Leben füllen:
<xc:this.onCloseExec>
<![CDATA[#{javascript:
var app = facesContext.getApplication();
app.createMethodBinding("#{javascript:print( 'Ich mache was' )}", null);
}]]>
</xc:this.onCloseExec>
Sobald der OK Button im Dialog geklickt wird, wird das Method-Binding ausgeführt.
In Java ist das einfacher zu realisieren.