Rich-UI-Infobus

Der Rich-UI-Infobus ist eine Bibliothek, die einen Publizierungs- und Subskriptionsmechanismus zur Verfügung stellt, der wie folgt funktioniert:
  • Ein Handler subskribiert ein Ereignis mit einem angegebenen Namen. Bei der Subskription gibt der Handler außerdem eine Funktion an, die Daten empfangen soll, wenn das Ereignis auftritt. Der Infobus registriert anschließend die Funktion, sodass sie zu gegebener Zeit aufgerufen werden kann.
    Der folgende Rich-UI-Handlerabschnitt subskribiert zum Beispiel ein Ereignis mit dem Namen 'sample.test' und gibt eine Bezeichnung ('Label'), d. h. einen Darstellungsbereich, an, der von einem einbettenden Handler verwendet werden kann:
    Handler embeddedHandler Type RUIHandler {onConstructionFunction=start}
    
       feedback TextLabel;
    
       function start()
          InfoBus.subscribe("com.mycompany.sample.test", showPublish);
       end
    
       function showPublish(eventName STRING in, data ANY in)
          feedback.text = "The " + eventName + " event occurred and passed " + data;
       end
    end  

    In einem etwas realistischeren Fall könnte die Funktion 'showPublish' einen Datensatz mit mehreren Datenfeldern empfangen und die Daten an einen fernen Service übertragen.

  • Derselbe oder ein anderer Handler in derselben Rich-UI-Anwendung publiziert das Ereignis, indem er den Namen des Ereignisses und ereignisspezifische Daten angibt. Zum Zeitpunkt der Publizierung ruft der Infobus die Funktion auf, die bei der Subskription angegeben wurde, und übergibt die ereignisspezifischen Daten an die Funktion.

    Beispiel: Der folgende Handler bettet den vorherigen ein, publiziert das Ereignis und bewirkt die Anzeige der folgenden Nachricht: The sample.text event occurred and passed input data for a service:

    Handler InfoBusTest Type RUIHandler
       { initialUI = [myButton, myDiv] }
    
       myButton Button{text = "Publish the event", onClick ::= clickHandler};
       myDiv Div { children = [new embeddedHandler{}.feedback] };
    
       function clickHandler(e Event in)
          InfoBus.publish("com.mycompany.sample.test", "input data for a service");
       end
    end	

    Beachten Sie, dass die Funktion InfoBus.publish den Namen der Funktion 'showPublish' nicht enthält. Stattdessen fungiert der Infobus als Mediator und stellt sicher, dass die entsprechende Funktion aufgerufen wird.

Infobusfunktionen

Die folgenden Infobusfunktionen werden verwendet:
  • Infobus.subscribe akzeptiert zwei Argumente: einen Ereignisnamen und eine Referenz auf die Funktion, die der Infobus aufruft, wenn das Ereignis publiziert wird. Der Ereignisname kann Platzhalterzeichen enthalten, wie dies später beschrieben wird.
    Sie müssen die Funktion codieren, die aufgerufen werden soll. Die Funktion basiert auf dem folgenden Stellvertreterabschnitt, der angibt, dass die Funktion jeden Typ von Daten akzeptieren kann, den Sie bereitstellen, wenn Sie das Ereignis publizieren:
    InfoBusCallback(eventName String in, data any in) 

    Infobus.subscribe gibt außerdem einen Subskriptionswert (Typ ANY) zurück, mit dem Sie die Subskription des Ereignisses aufheben können.

  • Infobus.unsubscribe akzeptiert nur einen Parameter: den Wert vom Typ ANY, der aus der Funktion 'Infobus.subscribe' zurückgegeben wird. Diese Funktion hat keinen Rückgabewert.
  • Infobus.publish akzeptiert zwei Argumente: einen Ereignisnamen und die Daten, die Sie angeben. Diese Funktion hat keinen Rückgabewert.

Wenn ein Rich-UI-Handler den Infobus subskribiert, kann dieser Handler nicht aus dem Speicher entfernt werden. Beispiel: Wenn ein Schaltflächenklick des Benutzers einen Handler in einer Funktion erstellt und wenn der Handler den Infobus subskribiert, können der Handler und seine Widgets erst aus dem Speicher entfernt werden, wenn der Handler die Subskription des Infobus aufhebt.

In den meisten Fällen wird der Speicher durch den EGL-Laufzeitcode freigegeben. Im folgenden Abschnitt wird jedoch beschrieben, wie eine größere Kontrolle über die Speicherverwaltung realisiert werden kann: “Rich-UI-Speicherverwaltung”.

Ereignisnamen und Platzhalterzeichen

Ein Ereignisname besteht aus einem oder mehreren Tokens, d. h. Zeichensymbolen wie sample und test (im beschriebenen Beispiel). Jedes Token wird durch einen Punkt vom nächsten getrennt.

Sie können Infobus.subscribe zum Subskribieren mehrerer Ereignisse verwenden. Zwei Platzhalterzeichen sind verfügbar und können beide im selben Aufruf von 'Infobus.subscribe' verwenden:
  • Wenn ein Stern (*) anstelle eines Tokens verwendet wird, wird die von 'Infobus.subscribe' registrierte Funktion aufgerufen, wenn Ihr Code ein Ereignis publiziert, dessen Name mit dem Ereignisnamen übereinstimmt, unabhängig von dem Token, das Sie an der Stelle des Sterns angeben. Beispiel: Wenn 'Infobus.subscribe' den Ereignisnamen mit com.mycompany.update.*.new.employee angibt, wird die von Infobus.subscribe registrierte Funktion als Antwort auf jeden der folgenden Aufrufe aufgerufen:
    InfoBus.publish("com.mycompany.update.sales.new.employee", "some data");
    
    InfoBus.publish("com.mycompany.update.marketing.new.employee", "some data");
    
    InfoBus.publish("com.mycompany.update.outreach.new.employee", "some data");
  • Wenn ein doppelter Stern (**) anstelle des letzten Tokens verwendet wird, wird die von Infobus.subscribe registrierte Funktion aufgerufen, wenn Ihr Code ein Ereignis publiziert, dessen Name mit dem Ereignisnamen übereinstimmt, unabhängig von der Reihe von Token (und zwischengesetzten Punkten), die Sie an der Stelle des doppelten Sterns angeben. Beispiel: Wenn 'Infobus.subscribe' den Ereignisnamen mit com.mycompany.update.sales.** angibt, wird die von Infobus.subscribe registrierte Funktion als Antwort auf jeden der folgenden Aufrufe aufgerufen:
    InfoBus.publish("com.mycompany.update.sales.new.employee", "some data");
    
    InfoBus.publish("com.mycompany.update.sales.temporary.employee", "some data");
    
    InfoBus.publish("com.mycompany.update.sales.outreach.new.temporary.employee", "some data");

Weitere Details

Der Infobusmechanismus basiert auf einer Implementierung der OpenAjax-Kooperation. Sie benötigen möglicherweise keine weiteren Informationen zu diesem Mechanismus. Ansonsten finden Sie sie wie folgt:
  1. Rufen Sie die Website der OpenAjax-Kooperation auf:

       http://www.openajax.org/index.php

  2. Klicken Sie auf Wikis > Member Wiki.
  3. Geben Sie die folgende Zeichenfolge in das Feld Search ein: OpenAjax Hub 1.0 Specification PublishSubscribe

Rich-UI unterstützt keine Spezifikationsausdrücke in Bezug auf filter oder scope.