Partial Refresh: Get vs. Post (2)

In bestimmten Konstellationen kann es vorkommen, daß ein Aufruf von XSP.partialRefreshPost nicht ausgeführt wird; der gleiche Aufruf in der GET-Variante hingegen funktioniert einwandfrei.

Das kann an der Implementierung der beiden Funktionen liegen, denn hier gibt es einen kleinen aber feinen Unterschied zu beachten: Wird ein POST-basierter Partial Refresh außerhalb einer Form ausgeführt (z.B. indem man mittels <xp:form>-Tag mehrere Forms in einer XPage definiert hat), wird er nicht ausgeführt, da die JS-Funktion XSP.findForm dann den Wert null zurück liefert.

Die GET-Variante ist anders implementiert, wie man im folgenden sehen kann:

 this.partialRefreshGet = function x_prfs(refreshId, options) {
   // Find the action URL
   var form = document.forms[0];
   if(form==null || !this.canSubmit()) {
      return false;
   }
   options = options||new Object()
   this._partialRefresh("get",form,refreshId,options)
}

[Fett: Es wird überprüft, ob die erste bzw. eine Form im DOM-Baum existiert]

Hier wird einfach nur die Existens irgendeines Formulars abgefragt bzw. das erste Formular im DOM-Baum herangezogen (Eine andere Fehlerquelle, denn dies kann bei mehreren Formularen zu Fehlern führen, wenn man z.B. explizit ein anderes Formular verarbeiten möchte).

Im Vergleich dazu die POST-Variante:

this.partialRefreshPost = function x_prfs(refreshId, options) {
   var form = this.findForm(refreshId);
   if(form==null || !this.canSubmit()) {
      return false;
   }
   options = options||new Object()
   if(options.immediate) options.valmode=0; // For compatibility only
   if (this._doFireEvent(null, form, refreshId, null, true,
      options.valmode, options.execId)){
      this._partialRefresh("post",form,refreshId,options)
   } else {
      this.allowSubmit()
   }
}

[Fett: Die Form mit der angegebenen „RefreshId“ wird vorausgesetzt. Existiert sie nicht, wird der Vorgang abgebrochen.]

Bei der POST-basierten Variante wird das Formular gesucht, in daß das HTML-Element mit der übergebenen RefreshID eingebettet ist – liegt das Element jedoch nicht in einem Formular sonder ist direkt im BODY des DOM-Baumes eingebettet, liefert die Funktion null zurück, und der Partial Refresh wird nicht verarbeitet.

Der Workaround liegt adaher darin, das zu refreshende Element in ein Formular zu betten. Dann kann es auch via XSP.partialRefreshPost aktualisiert werden.

Dieser Beitrag wurde unter Allgemein, Dojo Toolkit, Java Script, Web, XPages, XSP abgelegt und mit , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.