Autor Thema: [gelöst] Dojo Dialog -> Wert in Scope-Variable -> Wie weiterbearbeiten?  (Gelesen 3986 mal)

Mitch

  • Gast
Hallo zusammen,

ich baue mir gerade eine Picklist-Custom-Control, orientieren tue ich mich dabei an der "View Picklist Custom Control" von OpenNTF:
http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/View%20Picklist%20Custom%20Control
(Ich bastel was eigenes, da ich nur bestimmte Funktionen benötige und außerdem üben wollte. Meine Frage wäre aber auch beim verwenden der fertigen CC relevant.)

Diese Picklist liefert mir die Auswahl in einer Scope-Variable zurück. Wie kann ich diese nun direkt - ohne weiteren Klick - weiterverarbeiten?

Bei den Beispielen zur Variante aus OpenNTF wird der Wert einfach an ein Feld gebunden und dieses nach der Auswahl refresht. Das kann ich auch. Allerdings möchte ich den Wert nicht in einem Feld oder ähnlichem haben, sondern ihn in eine Funktion stecken.

Beispiel:

1) Start der Picklist/des Dialogs über einen Button.
2) Auswahl eines Wertes (z.B. Personalnummer aus meiner Personalansicht).
3) Picklist/Dialog wird geschlossen, der gewählte Wert steht in einer Scope-Variable (oder sonstwo, das kann ich ja noch ändern).
4) Diesen Wert will ich nun direkt (ohne weiteren Klick) weiter bearbeiten (z.B. um mit der gewählten Personalnummer als Parameter eine Funktion aufzurufen).

1 bis 3 funktioniert. Bei 4 hänge ich.

Ist das überhaupt möglich? Wenn ja: Wie gehe ich dafür vor (z.B. über ein "OnRefresh"-Event des Feldes oder ähnlichem)? Wenn nein: Was wäre eine alternative Vorgehensweise?

Beste Grüße,

Mitch

« Letzte Änderung: 18.02.13 - 13:17:02 von Mitch »

Mitch

  • Gast
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:
Code
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:
Code
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

Mitch

  • Gast
Ich bin mit meiner Variante nicht zufrieden. Daher versuche ich mein Problem nochmal anders zu schildern...

Mein Ziel:
Allgemein: Per Button wird eine Picklist aufgerufen, ein Wert ausgewählt und zurückgeliefert. Dieser Wert wird dann direkt weiterverarbeitet, z.B. mehrere Items des zugrunde liegenden Dokumentes geändert. In einem Klick, so wie man das aus dem guten, alten LotusScript kennt.

Konkretes Beispiel: Ein Dokument hat X beteiligte User. Ein weiterer User soll nun hinzugefügt werden. Die zur Verfügung stehenden User sind in einer Personaldatenbank hinterlegt. Aus dem Datensatz des gewählten, hinzuzufügenden Users werden Y Werte in verschiedene Items des Dokumentes geschrieben/angehängt, außerdem einige weitere Items neu berechnet (z.B. Zugriffsfelder).

Meine aktuelle Lösung:
Ein Button ruft einen Dojo-Dialog auf. Der Dialog ist meine Custom-Control-Picklist mit einer definierten Ansicht. Bei Auswahl eines Wertes wird der Dialog geschlossen und der Wert in ein (verstecktes) Feld der XPage geschrieben. Über eine Callback-Funktion wird ein Klick auf einen (versteckten) Button ausgeführt, welcher dann das Feld ausliest und den Inhalt mittels SSJS weiterverarbeitet.

Mein Resume:
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.

Meine Frage(n):
Geht das einfacher? Oder fährt man mit XPages/Webentwicklung ganz anders (falls ja: Wie)? Oder ist das gar der Weg den man gehen muss wenn man mit XPages bastelt?

Ich finde auch nichts im Netz dazu, vielleicht suche ich aber auch falsch. Denn eigentlich kann ich mir kaum vorstellen, dass noch kein XPage-Dev so etwas benötigt hätte.

Hilflose Grüße,

Mitch

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Zitat
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

Zitat
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?   ???

Zitat
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.

Zitat
(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:
Code
compositeData.onCloseExec.invoke( facesContext, null );

3. Dann die Eigenschaft in der jew. XPage mit Leben füllen:
Code
<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.

Mitch

  • Gast
Hallo Sven,

super! Vielen Dank, das ist genau das was ich gesucht habe. Funktioniert 1a!

Beste Grüße,

Mitch

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz