
SAPUI5 Custom Controls – Teil 1
SAPUI5 Custom Controls Teil 1
Um SAPUI5 Custom Controls besser erklären zu können haben wir uns für eine mehrteilige Blog-Reihe entschieden. Wenn der SAPUI5 Standard nicht mehr ausreicht, müssen Custom Controls entwickelt werden. Alles zum Thema Custom Control Development erfahren Sie hier.
SAPUI5 Custom Controls Teil 1 Inhalt:
Das Konzept
Der Aufbau
Properties
Aggregations
Associations
Events
Zusätze
Coding
Render Manager
Welches Konzept steckt hinter SAPUI5 Custom Controls?
In SAP UI5 ist es möglich, dass Sie bestehende Controls erweitern. Wenn die normalen Funktionalitäten eines Controls nicht mehr ausreichen. Ebenso lassen sich ganz neue Controls erstellen, um den wachsenden Anforderungsschwierigkeiten gewachsen zu sein.
Leider weichen Sie dann jedoch vom Fiori-Standard ab und ist nicht mehr Guideline-Konform. Jedoch kann es trotzdem sein, dass man eine Aufgabenstellung zu bewältigen hat, die mit dem Standard nicht abzubilden ist.
Genau hier tritt das Custom-Control-Konzept ins Spiel.
Wie ist der Aufbau von SAPUI5 Custom Controls?
Grundsätzlich ist ein UI5 Control nichts anderes als ein Modul. Es wird zur Laufzeit dynamisch nachgeladen. Ein solches Modul können Sie mit sap.ui.define erstellen und anschließend angesprechen.
Des Weiteren wird ein UI5 Control immer als HTML-Element gerendered. Wie genau das aussieht, wird immer im Control-spezifischen render-Methode über den RenderManager definiert. Mit dieser Methode können Sie das Custom Control in die HTML-Elemente umwandeln. So möchte es der Entwickler gerne haben. Es wird zum Beispiel beim Rendern einer sap.m.Table eine HTML-table mit td- und tr-Elementen in das DOM eingetragen und mit SAP-spezifischen CSS-Klassen gestyled.
Beim Aufbau von Eigenschaften eines Controls werden Sie immer in seinen Metadaten definieren. Ein Control hat ein dementsprechendes metadata-Object. Dort können Sie Properties, Events, Aggregations und Associations definieren. Diese können dann in der View und über den Controller angesprochen werden.
Dies sieht wie folgt aus:

Sobald ich die Methode extend von dem sap.ui.core.Control aufrufe, erstelle ich ein neues Control. Wenn ich das extend von einem bestehenden Control aufrufen, z.B. dem sap.m.Button, würde ich dieses erweitern.
Nach dem ich nun ein neues Control erstellt habe, kann ich die Metadaten definieren:
Properties im SAPUI5 Custom Control
Control-Properties bekommen ein Object zugewiesen, in dem Sie den Datentyp zuweisen und gegebenenfalls einen Default-Wert hinterlegen.
Folgende Einstellungen kann ich also vornehmen:
- type – Default type ist string.
- defaultValue
Zulässige Datentypen für die type-Property sind:
- string
- int
- float
- string[]
- …
Sie können auch eigene Konfigurationsproperties innerhalb meiner Property erstellen und diese dann zur Datenverarbeitung nutzen.

Aggregations
Aggregations können Sie mit 3 verschiedenen Konfigurationen erstellen.
- type – Default type ist sap.ui.core.Control.
- multiple – Default ist true.
- singularName
- visibility
Type gibt an, welches Control Sie gerne aggregieren möchten. Manchmal sind solche Aggregation-Controls nicht Module die von sap.ui.core.Control erben, sondern von der abstrakten Klasse sap.ui.core.Element. Sie haben daher keinen eigenen Renderer. Das Rendering von diesen Controls übernimmt das Control, das diese Elemente aggregiert. Mein Custom Control kann natürlich auch andere Custom Controls aggregieren.
Mit multiple: true kann ich sagen, ob meine Aggregation 0 bis N Controls aggregieren kann, oder ob nur ein Control in meiner Aggregation zugelassen wird.
Die Property singularName gibt einen String an, der für automatisch generierte Methoden eingefügt werden soll, um z.B. ein neues Item in die Items-Aggregation einzufügen.
Per visibility-Property lege ich fest, ob meine Aggregation in der View benutzt werden kann und ob sie für den Entwickler sichtbar sein sollte. Wenn die visibility auf Verbergen sein sollte, dann muss die Value „hidden“ vergeben werden.

Associations
Mit Associations können Controls miteinander verknüpft werden. Es kann eine Abhängigkeit erstellt werden. Das bekannteste Beispiel ist die labelFor-Property/Association vom sap.m.Label.
Associations haben den gleichen Konfigurations-Aufbau wie Aggregations. Sie haben daher auch:
- type
- multiple
- singularName
- visibility

Events
Controls können Eventhandler für bestimmte HTML-Events definieren. Für jedes selbstdefinierte Event werden automatisch folgende Funktionen erstellt:
- attach<Name>
- detach<Name>
- fire<Name>
Somit würde ich z.B. für mein Custom Event saveForm die Funktionen attachSaveForm, detachSaveForm und fireSaveForm automatisch generiert bekommen.
Sobald ich ein Event erstellt habe, muss ich nur mehr den dementsprechenden HTML-Eventhandler definieren und dort die fire-Methode meines Events aufrufen. Für die Event-Handler-Implementierung erstelle ich innerhalb meines Controls eine neue Methode, die genau so heißt wie das dementsprechende HTML-Event.
Events können auch Parameter definieren, die ich bei einem fireEvent befülle.
myEvent: {
parameters: { wasClicked: {type: „boolean“}}
}

Zusätze
Zusätzlich zu den 4 Basis-Konfigurationen stehen noch mehr Optionen zur Verfügung.
So kann ich
- dnd – Drag and Drop
- designtime – Design
- …
zusätzlich definieren und konfigurieren. Auch kann ich das Metadaten-Objekt um eigene Einstellungen erweitern.
Coding
Die wichtigste Methode unseres Controls ist die onInit-Methode. Diese wird beim Initialisieren unseres Controls aufgerufen und dient mir als Startmöglichkeit.
Weitere Funktionen können ganz normal als Objekt-Methoden eingefügt werden. Hier sollte aber auf das Naming der Methoden geachtet werden. Damit es keine Überschneidungen zu automatisch generierten Methoden kommt.
Mit Hilfe der automatisch generierten Set– und Get-Methoden meiner Properties kann ich jetzt auf diese zugreifen.
Render Manager im SAPUI5 Custom Controls
Nachdem ich nun die Metadaten und das Coding fertig habe, muss ich das Control auch dementsprechend anzeigen.
Hierfür dient der Render Manager in der renderer-Methode meines Controls. Mit dessen Hilfe kann ich in das DOM eingreifen und mein Control platzieren. Der Render Manager kommt in der renderer-Methode meines Controls zum Einsatz. Benutzt wird normaler HTML-Code, um unser Control in das DOM zu bringen.
Normalerweise wird die renderer-Methode in ein eigenes File ausgelagert.
Was sind wichtigsten Render Manger Funktionen?
Die wichtigsten Funktionen des RM’s sind:
- openStart – Erstellt ein neues öffnendes Element <…
- openEnd – Schließt das öffnende Element <…>
- close – Schließt das Element </…>
- write – Schreibt HTML-Code
- writeControlData – Schreib die Conrol-ID in das DOM
- renderControl – Ruft die renderer-Methode eines aggregierten Controls auf
- class – Fügt eine CSS-Klasse dem HTML-Element hinzu
- attr – Fügt dem Element ein Attribut mit Value hinzu
- …

Zusammenfassung
Wir sehen, dass das Erstellen eines Custom-Controls einige Möglichkeiten beinhaltet. Wir können Properties, Aggregations, Events und Associations definieren. Zusätzlich benötigen wir noch die renderer-Methode mit dem RenderManager, um unser Control in das DOM zu bringen und anzuzeigen.
Falls Fragen auftauchen, können sie gerne unten in den Kommentaren gestellt werden. Ich freue mich auf Feedback.
Im nächsten Blog-Part 2 werden wir ein Beispiel-Control entwickeln und uns im Detail die Implementierung ansehen.
Recent Comments