en

Business Entities

Mit unserem minimalistischen Konzept zu "Business Entities" sind Datensätze gemeint, die einem bestimmten Datentyp (z.B. "kunde") entsprechen und über einen eindeutigen Schlüssel (key) verfügen; mit anderen Worten: Business Entities geben den Daten ausreichend Semantik, um zumindest bei einfachen Operationen wie dem Löschen oder dem Aktualisieren eines Datensatzes Teile des Codes generisch/abstrakt zu halten.

Sinnvoll sind Business Entities insbesondere bei AJAX-getriebenen single-page-web-apps. Derselbe Datensatz (oder Teile davon) kann hier in mehreren Panels gleichzeitig zu sehen sein. Wird dieser in einem Panel geändert oder gelöscht, wird per AJAX-Aufruf i.d.R. eine Änderung in der Serverdatenbank angestoßen. Die meist asynchron eintreffende Antwort des Servers kann im success-handler der AJAX-Operation ausgewertet werden.

Enthält die Antwort ein oder mehrere "Entity-Event(s)" mit dem Datentyp und den eindeutigen Schlüsseln betroffener Entities, können hier Javascript-Event(s) getriggert werden, die von betroffenen Panel- oder Control-Instanzen (die mit diesem Datentyp "markiert" sind) ausgewertet werden.

Business Entities werden von unserem Control xw-browse unterstützt, wenn bei der Initialisierung der Name des Datentyps im Property "datatype" übergeben wird und im Property "meta" die eindeutigen keys definiert werden. Der Name des Datentyps wird dem Control dann automatisch als CSS-class mit dem Präfix "xw-datatype-" hinzugefügt (z.B. bei Datentyp "kunde" also die Klasse "xw-datatype-kunde"). Somit können z.B. die dem Datentyp "kunde" entsprechenden Controls über

$(".xw-datatype-kunde").trigger(...);

gezielt benachrichtigt werden.

XML-Events

Da unsere Web-Apps über XML-Nachrichten zwischen Client (Browser) und Server kommunizieren, haben wir für die beiden wichtigen Events "entities-deleted" und "entity-updated" spezielle XML-Konstrukte definiert, die nach der jeweils erfolgreichen Transaktion am Server dem Client in der Serverantwort mitgeteilt werden.

Beispiel-Events für den Datentyp "kunde"

<!--Server informiert Client, dass die zwei Kunden mit den primary keys "180" und "582" erfolgreich gelöscht wurden--> <response> <event datatype="kunde" type="entities-deleted"> <key> <pk>180</pk> </key> <key> <pk>582</pk> </key> </event> </response>
<!--Server informiert Client, dass der Kunde mit primary key "582" in einigen Feldern verändert wurde--> <response> <event datatype="kunde" type="entity-updated"> <key> <pk>582</pk> </key> <values> <name>Mustermann</name> <plz>91320</plz> <ort>Ebermannstadt</ort> <notiz> <line>Der Kunde wünscht</line> <line>keine Werbung per E-Mail.</line> </notiz> <titel is-null="true"/> </values> </event> </response>

Triggern der Events im AJAX-success-handler:

function (response) {
  $(response).find(">response>event").each(function () {
    var e = $(this), keys = [];
    e.find(">key").each(function () {
      var key = {}, cn = this.childNodes;
      for (var i = 0; i < cn.length; i++) { 
        var node = cn[i]; 
        if (node.nodeType == 1) // element node
          key[node.nodeName] = $(node).text();
      }
      keys.push(key);
    });
    $(".xw-datatype-" + e.attr("datatype")).trigger(
      e.attr("type"), { event: e, keys: keys });
  });
} 

Bei mehrsegmentigen Schlüsseln enthalten die key-Elemente mehrere Unterelemente. Eine Serverantwort darf beliebig viele event-Elemente enthalten.

Javascript Event-Handler

Eigene Panels oder Controls können am Entity-Event-Konzept teilnehmen, indem sie die Datentyp-Klasse zugeordnet bekommen und die Events verarbeiten, z.B.:

$("#myKunde").addClass("xw-datatype-kunde").on("entities-deleted", function (e, ui) { 
    myDeleteRows(ui.keys); 
    return false;
}).on("entity-updated", function (e, ui) {
  var row = myFindRow(ui.keys[0]);
  if (row != null) myUpdateRow(row, ui.event.find(">values"));
  return false;
});