Rich-UI-Infobus
- 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 endIn 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 endBeachten 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
- 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.
- 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
- Rufen Sie die Website der OpenAjax-Kooperation auf:
- Klicken Sie auf Wikis > Member Wiki.
- 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.