BA bietet mit dem EventManager
eine einfache Möglichkeit für Projekte im Browser Ereignisse aller Art auszulösen und darauf zu reagieren. Von dem Basissystem werden eine Reihe von Standardevents automatisiert ausgelöst, die entsprechend verwendet werden können.
Standard-Events
Für die Standard-Event-Typen stehen clientseitig Konstanten in der Klasse BA.Ui.Event.StandardEventTypes
zur Verfügung.
Die zur Verfügung stehenden Events sind:
FieldUpdate
reserviert, bitte über die im nachfolgenden beschriebenen API “Feldänderung eines Datensatzes” nutzenTabOpening
Wird gefeuert, wenn ein Tab geöffnet werden soll. Der Rückgabewert der Handler entscheidet, ob der Tab dann tatsächlich geöffnet wird.TabOpened
Wird gefeuert, nachdem ein Tab geöffnet und dessen Inhalt vollständig geladen wurde.TabActivated
Wird gefeuert, wenn der aktuelle Tab in der Ui gewechselt wurde.TabClosing
Wird gefeuert, wenn ein Tab geschlossen werden soll. Der Rückgabewert der Handler entscheidet, ob der Tab dann tatsächlich geschlossen wird.TabClosed
Wird gefeuert, wenn ein Tag final geschlossen wurde.RecordSaving
Wird gefeuert, wenn ein Datensatz gespeichert werden soll. Der Rückgabewert der Handler entscheidet, ob der Datensatz dann tatsächlich gespeichert wird.RecordSaved
Wird gefeuert, wenn ein Datensatz erfolgreich gespeichert wurde.RefreshGrids
Wird gefeuert, wenn die Menübandaktion “Ansichten aktualisieren” betätigt wird.
Alle Tab-Events bekommen in den Daten das betreffende Tab-Objekt unter dem Schlüssel Tab
geliefert.
Ausnahme hiervon ist TabOpening
, weil zum Aufrufzeitpunkt noch kein Tab-Objekt existiert; dieser Event bekommt alle Kontextinformationen geliefert, die in der Funktion OpenTab
zur Vefügung stehen:
let eventData: CustomData = {
url: baseUrl + tmpUrl,
willActivate: tmpUrlLwr.indexOf("andredirect") < 0,
overrideTabReference: overrideTabReference,
asLastVisibleTab: asLastVisibleTab,
isUniqueTab: isUniqueTab,
predecessor: predecessor,
};
Alle Save-Events bekommen die Oid des betreffenden Datensatzes unter dem Schlüssel Oid
und den Orm-Typen unter OrmType
geliefert.
let eventData: CustomData = {
Oid: oid,
OrmType: ormType,
};
Einfaches Beispiel (in der Browser-Konsole nachstellbar):
BA.Ui.Event.EventManager.AddEventHandler(BA.Ui.Event.StandardEventTypes.TabOpening, "myHandlerUniqueId", (data) => { console.log(data); return true; }, null);
"myHandlerUniqueId"
entspricht einer eindeutigen Id des eigenen Event-Handlers. Kann beispielsweise bei der Deregistrierung verwendet werden. Genauere API Beschreibung folgt.
Öffentliche API / Eigene Events
Auf der TypeScript-Klasse BA.Ui.Event.EventManager
stehen folgende Funktionen zur öffentlichen Verwendung zur Verfügung:
public static AddEventHandler(type: string, id: string, handler: Function(data: CustomData), scope: string = null): void
Die Funktion prüft zunächst, ob bereits ein Handler mit derselben Id registriert ist und entfernt diesen, falls dies der Fall ist.
Das heißt im Umkehrschluss, dass immer nur ein Handler mit derselben Id registriert sein kann. Dies gilt für die gesamte Applikation, die in einem Browser-Fenster geöffnet ist.
Die Handler-Funktion ist eine Funktion mit einem Parameter des Typs CustomData
, welcher ereignisspezifische Daten beinhaltet, welche beim Triggern des entsprechenden Events übergeben werden können. Die Handler-Funktion wird automatisch in dem Fensterkontext (iFrame) ausgeführt, aus welchem heraus sie registriert wird.
Der Parameter scope
dient zur Beschränkung der Grültigkeit eines Events beispielsweise auf den aktuellen Tab.
Hierfür kann die Gültigkeit eines Events z.B. auf die Id des aktuellen Tabs eingeschränkt werden. Diese Einschränkung sollte dann bei TriggerEvent
ebenfalls mit berücksichtigt werden.
public static RemoveEventHandler(id: string): boolean
Diese Funktion deregistriert den konkreten Event-Handler mit der gegebenen Id und gibt true
zurück, sollte dies gelungen sein.
Wenn unter der gegebenen Id keine Handler-Funktion registriert ist, gibt die Funktion entsprechend false
zurück.
Es ist nicht zwingend notwendig, alle Handler innerhalb eines Tabs zu deregistrieren, wenn der Tab geschlossen wird; dies erfolgt automatisch.
Sollten Ereignisse im Kontext von Dialogen angemeldet worden sein, so müssen diese beim Schließen des Dialogs vom Entwickler deregistriert werden.
public static TriggerEvent(type: string, scope: string = null, data: CustomData = null): boolean
Diese Funktion führt zum Aufruf aller Event-Handler, welche für den gegebenen Typen und den gegebenen Gültigkeitsbereich scope
registriert sind.
Die Reihenfolge, in der die Handler-Funktionen ausgeführt werden, ist undefiniert.
Der Rückgabewert dieser Funktion ist true
solange alle Handler-Funktionen true
zurückgeben. Gibt nur eine der Handler-Funktionen false
zurück, ist der Rückgabewert hier auch false
.
Alle Handler-Funktionen bekommen dasselbe Datenobjekt data
übergeben.
Beispiel
Einfaches Beispiel welches in der Browser-Konsole nachstellbar ist.
Schritt 1: Registrieren zweier Event-Funktionen für einen eigenen Event-Typen mit unterschiedlichen Geltungsbereichen
BA.Ui.Event.EventManager.AddEventHandler("MyEventType", "myUniqueId-1", (data) => { console.log(data); return true; }, top.tabController.ActiveTab.Guid);
BA.Ui.Event.EventManager.AddEventHandler("MyEventType", "myUniqueId-2", (data) => { console.log(data); return true; }, "ownScope");
Schritt 2.1: Triggern eines konkreten Events
BA.Ui.Event.EventManager.TriggerEvent("MyEventType", "ownScope", {mydata: "Event was triggered!"});
Es wird nur der Event-Handler ausgeführt, der unter dem angegebenen Geltungsbereich registriert wurde.
Schritt 2.2: Triggern aller Events
BA.Ui.Event.EventManager.TriggerEvent("MyEventType", null, {mydata: "Event was triggered!"});
Weil der angegebene Geltungsbereich null ist, werden BEIDE Event-Handler ausgeführt.
Schritt 3: Deregistrieren der Event-Handlers
BA.Ui.Event.EventManager.RemoveEventHandler("myUniqueId-1")
BA.Ui.Event.EventManager.RemoveEventHandler("myUniqueId-2")
Eigene Events auswählbar in der Konfiguration
Die Applikation beinhaltet eine Auswahlliste, in welcher alle Event-Typen, die unterstützt werden, hinterlegt sind. Diese Liste heißt BA.Core.Enums.EnumUiEventType
.
Die hier beinhalteten Werte dienen der Auswahl von Events in entsprechenden Steuerelementen und generell nur zur serverseitigen Verwendung.
Die Enum-Werte selbst besitzen eine Eigenschaft, die besagt, ob sie in der UI auswählbar sein sollen, und den Typ-String, welcher in der Ui als Event-Typ verwendet wird.
Dieser darf nicht doppelt vorkommen. Eine Überprüfung findet aber nicht statt. Bei Erweiterung der Auswahlliste sollten daher passende Prä- oder Postfixes verwendet werden und sollten nur aus Buchstaben bestehen.
Feldänderung eines Datensatzes
Die EventManager
Klasse bietet eine spezielle API für die Änderung der Felder. Soll auf Feldänderungen reagiert werden oder wird ein eigenes Maskensteuerlement implementiert, muss diese API verwendet werden.
public static AddFieldUpdateHandler(fieldName: string, handler: Function(data: UpdateFieldEventData), scope: string): string
Diese Funktion registriert einen Event-Handler, der bei einer Wertänderung des gegebenen Feldes in der Ui automatisch getriggert wird. Sie gibt eine generierte Id zurück, welche zusammen mit RemoveFieldUpdateHandler verwendet werden kann, um den Handler zu deregistrieren.
Die übergebenen Daten der Klasse UpdateFieldEventData
beinhalten folgende Werte:
Type: string
Typ des gefeuerten Events (üblicherweise in diesem Fall"FieldUpdate"
)FieldName: string
Name des geänderten Feldes (abstrahierter Feldname, ggf mit Teildatensatzbezeichner"Addresses.PostalCode"
aber ohne Dialog-Prefix und ohne Teildatensatzindex)Context: Window
Kontext der Handler-FunktionScope: string
Gültigkeitsbereich des Event-HandlersFullFieldName: string
Voller Name des geänderten Feldes (mit Index bei Änderung eines Feldes auf einem Teildatensatz"Addresses[0].PostalCode"
oder mit Dialog-Prefix in Dialogen"DLG1.Addresses[0].PostalCode"
)AdditionalData: CustomData
zusätzliche Informationen (im Standard leer)
public static RemoveFieldUpdateHandler(fieldName: string, scope: string, id: string = null): boolean
Deregistriert einen konkreten Handler unter Ferwendung des zugehörigen Feldnamens und der von AddFieldUpdateHandler
zurückgelieferten Id.
public static TriggerFieldUpdated(fieldName: string, scope: string, fullFieldName: string = null, additionalData: CustomData = null): boolean
Triggert alle Feldaktualisierungs-Handler für ein bestimmtes Feld. Diese Funktion wird im Standard automatisch bei allen Änderungen von editierbaren Feldern aufgerufen.