
SAPUI5 Custom Controls – Teil 2
SAPUI5 Custom Control Teil 2
Der Weg zum eigenen Control
Da wir nun im letzten Teil alles über den generellen Aufbau eines SAPUI5 Custom Controls gelernt haben, möchten wir das ganze in der Praxis anwenden.
Wie lege ich im SAPUI5 Custom Control eine Liste von Personen?
Unsere Aufgabenstellung ist folgende:
Wir möchten einen Weg finden, um eine Liste von Personen gemäß hypothetischen Firmen-Design-Guidelines darzustellen. Leider reicht das UI5 Framework für die angenommene Einschränkung nicht aus.
Daher benötigen wir ein Custom Control. Genauer gesagt, benötigen wir folgende Komponenten:
- PersonList – Darstellung unserer Liste
- PersonListItem – Eine einzelne Zeile
- style.css – Custom Styling
Optional können noch folgende Files angelegt werden:
- PersonListRenderer – Zum ausgelagerten Rendern der Liste
- PersonListItemRenderer – Zum ausgelagterten Rendern eines Items
PersonListItem im SAPUI5 Custom Control
Wir arbeiten uns von unten nach oben. D.h. wir fangen mit unserem aggregierten Control an, welches eben das einzelne Listitem wäre.
Ausgeben möchten wir Vorname, Nachname und das Alter der Person. Um noch ein Custom-CSS reinzubekommen, werden wir Personen mit einem Alter geringer als 18 anders formattieren.
Erstellen wir zunächst ein neues UI5 Projekt und legen die Files für die Custom-Controls an.
Anschließend definieren wir ein Template für das PersonListItem:

Wir wissen, dass wir mit sap.ui.define ein neues Modul anlegen, das zur Laufzeit dynamisch von unserem UI5 Framework geladen wird. Und genau so definieren wir eben auch ein Custom Control. Dieses inkludiert das sap.ui.core.Control, welches wir per .extend erweitern und zurückliefern.
Unsere PersonListItem soll 3 verschiedene Personaleigenschaften ausgeben. Daher brauchen wir 3 Properties (Vorname, Nachname, Alter).
Aggregations soll unser PersonListItem nicht haben, denn wir möchten das PersonListItem selbst als zu aggregierendes Control verwenden.
Properties anlegen
Wir benötigen 3 Properties:
- firstName: string
- lastName: string
- age: int
Auf die Properties kann per get<PropertyName>() zugegriffen werden.

Events anlegen
Wir möchten, dass bei einem Click auf das PersonListItem ein Event ausgeführt wird. Dieses liefert eine Hallo-Message zurück.
- sayHello
- parameter: message(string)
Anschließend definieren wir eine Eventhandler für das HTML-onclick-Event. Falls dieses auftritt, triggern wir das sayHello-Event und liefern eine Message bestehend aus Name und „says hello“ per message-Parameter zurück.

CSS Styling
Wir möchten unsere 3 Properties per HTML-ul-Element anzeigen. Da ist jedoch das Problem, dass die Liste standartmäßig untereinander ihre Items anordnet. Um das zu umgehen, sagen wir per CSS-Klasssenselektor, das alle li-Elemente unter der Klasse die CSS-Property display mit dem Wert inline bekommen.
Und zusätzlich definieren wir noch ein padding von 10 Pixel und die Schriftfarbe black;

Renderer
Der Renderer ist das Herzstück unseres Controls. Hier wird definiert, was wann und wie in das DOM eingtragen werden soll.
Die wichtigsten Renderer-Funktionen sind dem letzten Blog-Teil zu entnehmen.
Wir möchten unser Control als div-Element und einer ul ausgeben. Zusätzlich möchten wir noch das Alter dementsprechend farblich hervorheben, basierend auf dem Kriterium, dass das Alter > 18 ist.

1: div ausgeben
Zu aller erst erstellen wir per openStart ein öffnendes div-Tag. Dieses div-Tag wird per writeControlData die Control-Referenz geschrieben und anschließend fügen wir noch unsere CSS-Klasse hinzu. Dann wird das öffnende div-Tag mit > geschlossen.
2: Liste aufbauen
Wir erstellen eine neue unordered-list. Als erstes List-Item geben wir den Vornamen der Person aus und dann den Nachnamen.
3: Alter ausgeben
Je nach dem ob die Person ein Alter > 18 hat, erstellen wir ein List-Item mit dem Style color: red oder color: green.
4: Alles schließen
Zu letzt schließen wir die Liste und abschließend das div-Tag.
Somit ist unser PersonListItem komplett. Im nächsten Schritt werden wir nun die PersonList definieren und unser PersonListItem aggregieren.
PersonList im SAPUI5 Custom Control
Die PersonList soll einen Titel bekommen und unsere Personen per PersonListItem anzeigen.
Hierfür benötigen wir Properties und Aggregations.

Metadata definieren
Wir benötigen folgende Property für unseren Titel:
- title (string) – default: Persons
Zusätzlich möchten wir noch PersonListItems aggregieren:
- items (PersonListItem) – multiple: true

CSS Styling
per list-style: none sagen wir, dass unsere Personenliste keine Aufzählungszeichen haben sollte.
Dann selektieren wir alle Items mit einem ungeraden Index und färben diese grau ein.
Zusätzlich geben wir noch ein seitliches margin von 15 Pixel.

Renderer definieren
In unserem Renderer wollen wir den Titel der Personenliste und aggregiert die PersonListItems ausgeben.

1: div öffnen
Gleich wie beim PersonListItem öffnen wir einen div-Container und vergeben CSS-Klasse und Control-Data.
2: Titel ausgeben
Der Titel wird innerhalb eines h2-Tags ausgebeben.
3: Items-Aggregation rendern
Per getAggregation(„items“) können wir uns den Inhalt der Items-Aggregation in einem Array speichern. Dieses Array laufen wir durch und erstellen für jeden Eintrag ein neues li-Tag mit der myPersonListItemSelector-Klasse. Dieses bekommt ihren Inhalt per renderControl()-Funktion, welche die render-Methode des übergebenen Controls aufruft. In unserem Fall ist das das PersonListItem.
4: alles schließen
Abschließend fügen wir noch die schließenden ul- und div-Tags hinzu.
Jetzt sind unsere Custom-Controls fertig und können in den Views verwendet werden.
Controls verwenden
Die beiden Custom Controls können nun in unserer View verwendet werden.

1: Namespace einbinden
Um Controls aus einem anderen Namensraum einzubinden, muss für diesen ein Alias angelegt werden. Wir verweisen hier auf unseren Folder, wo wir die Controls angelegt haben.
2: PersonList einfügen
Wir legen eine neue PersonList an. Dort vergeben wir die title-Property und legen eine items-Aggregation an.
3: PersonListItems hinzufügen
In der items-Aggregation legen wir nun mehrere PersonListItems an. Das würde natürlich auch über Aggregation-Binding in der PersonList per Model funktionieren.
Wir legen aber z.B. 3 PersonListItems an und vergeben allen Properties Werte. Zusätzlich definieren wir eine Funktion für unser sayHello-Event.
Dieses müssen wir dann noch im zugehörigen Controller ausprogrammieren.
Also definieren wir eine neue Methode namens onSayHelloHandler, wo wir den Eventparameter message auslesen und per alert anzeigen.

App ausführen
Unsere App ist nun funktionsfähig und zeig unsere Custom-Controls richtig an.
Wir sehen nun unseren Titel und 3 darunterliegende Personen, die farblich abwechselnd hinterlegt sind.

Zusammenfassung
In 2 Blogteilen haben wir nun alles Notwendige gelernt, um mit dem Entwickeln von eigenen Custom-Controls durchzustarte, falls die Anforderungen nicht durch das umfangreiche SAPUI5 Controls-Paket abgedeckt wird.
Eine weitere Vorgehensweise könnte sein, meine eigenen Custom-Controls in eine UI5-Library/Git Repo zu packen und zu deployen. Dann kann ich diese in weiteren Applikationen verwenden und kann mir meine eigene, umfangreiche Library bauen.
Nur sollte man nicht für jede Anforderung ein neues Control entwickeln oder ein bestehendes zu erweitern. Man sollte so gut und so weit wie möglich mit dem arbeiten, was einem das SAPUI5 Framework zur Verfügung stellt und sich so weit wie möglich in die Materie einarbeiten.
Wer also gerne mehr bezüglich UI5 wissen möchte, kann sich gerne unseren zahlreichen Blogs bedienen.
Die interessantesten für das Controls-Thema sind:
- Data Binding von Rene Glavanovits
- Custom Controls Part 1 von Maximilian Olzinger
- Git im SAP Umfeld von Daniel Krancz
Vielen Dank für das Lesen dieser Blogreihe und wenn Fragen auftreten, können sie gerne in den Kommentaren gestellt werden.
Recent Comments