Bonnes pratiques et exemples de code pour les développements UI5
La structure visée est la suivante :
- Formatter, Models, et autres classe utilitaires de traitement des données dans le répertoire model
- Fragments dans un sous-répertoire des vues
- Les éventuels models locaux JSON également dans le répertoire model
- Les éventuelles annotations dans un fichier nommé suivant le nom du service et dans le répertoire model ou localService
Exemple :
Créer une classe Models.js qui contiendra toutes les opérations liées aux modèles de l'application (CRUD...)
Exemple de Models.js :
sap.ui.define([
"sap/ui/base/Object",
"sap/ui/model/json/JSONModel"
], function(Object, JSONModel ) {
"use strict";
return Object.extend("<mon_package>/model/Models", {
oComponent: null,
constructor: function(oComponent) {
this.oComponent = oComponent;
},
[...]
});
});
Pour y accéder facilement on peut instancier cette classe dans le composant et créer un getter correspondant
[...]
modelHelper: null,
[...]
init: function() {
[...]
this.modelHelper = new Models(this);
[...]
},
getModelHelper: function() {
return this.modelHelper;
}
Pour simplifier le code des controllers, on pourra dans le BaseController créer une méthode d'accès
getModelHelper: function() {
return this.getOwnerComponent().getModelHelper();
}
Utiliser l'événement onRouteMatched pour les traitements initiaux. Ensuite effectuer les éventuels appels oData sous forme de promesses chainées après la chargement des métadonnées du modèle.
onInit: function() {
this.getRouter().getRoute("<ma_route>").attachMatched(this.on<ma_route>Matched);
},
on<ma_route>Matched: function(event) {
this.getView().setBusy(true);
this.getModel().metadataLoaded()
.then(this.getModelHelper().<lecture_du_modèle>)
.then(this._<maj_de_l_ui>);
}
- Application : Z_ (ex : ZSD_LISTE_CMDS) (15 char max)
- Namespace : ch.rolex.. (Ex : ch.rolex.sd.liste_cmds)
- Vues : .view.xml (Ex : main.view.xml)
- Fragments : .fragment.xml (Ex : table.fragment.xml)
- Controlleurs : .controller.js (Ex : Main.controller.js)
- Model local : .json
- Fichiers d’annotations : <Nomdumodèle>.anno.xml
Dans component.js :
metadata: {
manifest: "json",
config: {
fullWidth: true
}
},
Dans index.html :
sap.ui.getCore().attachInit(function() {
new sap.m.Shell({
app: new sap.ui.core.ComponentContainer({
height : "100%",
name : "ch.rolex.pm.demandemobilier-createdemandemobilier"
}),
appWidthLimited: false
}).placeAt("content");
});
Dans les project settings -> Code checking -> Javascript -> Validator configuration
- Promesses : utilisation des promesses (exemple de chainage)
- Classe : utilisation des class (ES6)
- ES6 : exemples de nouvelle syntaxe ES6 (déclarations, fonction fléchées, template, class...)
- Validation Form : routine pour validation des champs obligatoires d'un form