Events zwischen Views austauschen

Wenn eine Fiori Anwendung aus mehreren Views besteht, müssen manchmal bestimmte Ereignisse zwischen den Views ausgetauscht werden. So kann beispielsweise eine Einstellung an der Master View bestimmte Ereignisse in einer Detail View auslösen. Dies lässt sich mit der Nutzung des JavaScript EventBus erreichen.

Beispiel

Eine Fiori Anwendung besteht aus zwei Views, einer Main View, welche Kopfdaten und Steuerelemente enthält, und eine Detail View, welche die eigentlichen Inhalte darstellt.

In der Detail View sollen Daten gefiltert dargestellt werden. Der Filterwert selbst wird aber von der Main View bereitgestellt. In der Main gibt es ein Select Control, welches die Filterwerte enthält. Sobald der Benutzer einen Wert ausgewählt hat, soll der Filter in der Detail View entsprechend gesetzt werden.

Lösung

Dies lässt sich einfach durch den EventBus realisieren. Dies ist ein Publish/Subscribe Modell zum Austausch von Nachrichten oder Events.

In der Detail View wird zunächst in der Funktion onInit ein Listener für den EventBus erstellt.

onInit: function () {

	// Subscribe zu einem Event, um Filter neu zu setzen
	sap.ui.getCore().getEventBus().subscribe(
		"myTopicIWantToSubscribe",
		"SetFilter",
		this.applyFilter,
		this
	);

},

Sobald eine Komponente zu dem hier angegebenen Event Daten bereitstellt, wird die Funktion applyFilter des Controllers der Detail View aufgerufen.

Ein Event lässt sich in der Main View wie folgt auslösen

// Eventbus auslösen, damit InspectionLot View den Filter übernimmt
sap.ui.getCore().getEventBus().publish(
	"myTopicIWantToSubscribe",
	"SetFilter",
	"is called from function of the second controller."
);

Wenn die Anwendung über ein Fiori Launchpad aufgerufen wird, muss darauf geachtet werden, dass die Anwendung sich vom EventBus abmeldet, sobald sie geschlossen wird. Da es sich hier um eine Komponente aus sap.ui.core handelt, bleibt die Registrierung erhalten, wenn sie nicht explizit gelöst wird. Dies hat zur Folge, dass die Anwendung bei einem erneuten Aufruf fehlerhaft arbeitet.

Dies kann in dem Controller der Detail View verhindert werden, indem in der Methode onExit alle registrierten Events beim EventBus abgemeldet werden

onExit: function () {
	sap.ui.getCore().getEventBus().unsubscribe(
		"myTopicIWantToSubscribe",
		"SetFilter",
		this.applyFilter,
		this
	);
},

Mit dem hier beschriebenen Vorgehen kann die Detail View benachrichtigt werden, dass neue Daten vorliegen. Die eigentlichen Daten (z.B. der neue Filterwert) selbst wird wie gewohnt über ein gemeinsames JSON Modell ausgetauscht.