Domino 9 und frühere Versionen > ND6: Entwicklung

[web] ajax in notes

<< < (3/4) > >>

machineslave:
Hallo Notes Gemeinde,

ich habe mich in den letzten Tagen mit Ajax beschäftigt und muss sagen: sehr geniale Sache.
Ich habe letzte Woche einen Thread hier reingestellt (http://atnotes.de/index.php?topic=27237.0 :Dynamische Dialoglisten im Web, ohne Seite neu zu laden), bei dem es um mehrere untereinander abhängige ComboBoxen geht, die über @DbLookups gefüllt werden.

Das habe ich jetzt komplett mit Javascript/Ajax/Notes Agent realisiert und das funktioniert ziemlich gut (und ist dabei eigentlich auch ziemlich einfach).

Und der weitere Vorteil: das ist wesentlich schneller als das herkömmliche @DbLookup und dabei die Maske immer neu laden zu müssen.

Gruß

Stefan

flaite:
Wäre nett, wenn du eine abgespeckte Beispielanwendung posten könntest.

machineslave:
Guten Morgen zusammen,

ich habe ein kleines Problem bzgl Ajax:
Folgendes Gerüst habe ich für den Aufruf eines Server-Agenten, welcher mir über einen "Lookup" eine Liste zurückliefert, welche ich dann entsprechend in eine ComboBox fülle. Das funktioniert soweit ganz gut.
Allerdings möchte ich folgendes beim Öffnen der Maske ausführen:
- Fülle die erste ComboBox (ListeA) mit Werten (mache ich über einen normalen @DbColumn; funzt auch)
- Nehme den ersten Wert aus ListeA und fülle die zweite ComboBox (ListeB) mittels Ajax (funzt auch)
- Setze den ersten Wert in ListeB als selektiert (document.forms[0].ListeB.selectedIndex =0)
- Rufe wieder u.a. Routine auf, um ListeC zu füllen; der Parameter soll nun der aktuelle Wert der ListeB sein.

Hier ist nun das Problem:
Da Ajax nun mal asynchron ist, wartet die Routine, welche nach und nach u.a. Funktion aufruft, nicht, dass der Request an den Server vollständig durchgeführt wurde. Demnach wird bereits die Funktion zum Füllen von ListeC aufgerufen, selbst wenn ListeB noch nicht gefüllt sein sollte, was natürlich zu einem Fehler führt.
Hat jemand eine Idee, wie ich das per JavaScript abfangen kann?

Gruß

Stefan



var req;
function loadXMLDoc(url)
{
   if (window.XMLHttpRequest)
   {
      req = new XMLHttpRequest();
      req.onreadystatechange = processReqChange;
      req.open("GET", url, true);
      req.send(null);
   }
   else if (window.ActiveXObject)
   {
      req = new ActiveXObject("Microsoft.XMLHTTP");
      if (req)
         {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
         }
   }

}

function processReqChange()
{
   if (req.readyState == 4)
   {
      if (req.status == 200)
      {
         eval(req.responseText);
      }
      else
      {
         alert ("Problem retrieving data");
      }
   }
}

flaite:
Das sind schon die schwierigeren Punkte.
Dies ist aber sicher ein ziemlich generisch.
So fit bin ich da auch noch nicht.
In dem screenshot weiter oben siehst du wie mit Hilfe des Prototype Frameworks der an sich asynchrone Ablauf in einem Call zusammengeschoben wird.
So ungefähr könnte es gehen. Du müsstest die beiden remote Calls zu einem remote Call machen, der durch das Framework hinsichtlich Nachricht senden/Nachricht empfangen synchronisiert wird.

Wie gesagt. Ich bin da selbst noch nicht der guru drin. Das sind auch letztlich die Fälle, bei denen man ein bischen tiefer in die Materie einsteigen muß.

Gruß Axel

machineslave:
Hallo,

was ich eigentlich vorhabe, ist, mehrere Lookups hintereinander aufzurufen.
Dabei muss natürlich vor Aufruf des nächsten Lookups der vorige Request abgeschlossen sein.
Ergo: Ich möchte eigentlich synchrone Aufrufe (entgegen dem eigentlichen Nutzen von Ajax).

Laut Syntax kann man als 3. Parameter bei req.open den Wert false angeben (siehe unten), dann wird der Request synchron aufgerufen (sprich, der restlich JavaScript Code wird erst nach Fertigstellung des HttpRequests aufgerufen).
Im IE funktioniert das auch, allerdings mag Mozilla das wohl garnicht. Wenn man bei Mozilla den Parameter auf false setzt, wird der Request erst garnicht ausgeführt.

  if (window.XMLHttpRequest)
   {
      req = new XMLHttpRequest();
      req.onreadystatechange = processReqChange;
      req.open("GET", url, false);
      req.send(null);
   }

Weiss jemand, wie ich mir irgendeinen Handler oder sowas bauen muss, damit mein Problem behoben ist?

Gruß

Stefan

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln