Je veux faire un peu de logique avant qu'une vue ne soit affichée à chaque fois.Je ne peux pas aller avec avant la méthode de rendu car elle n'est appelée qu'une seule fois lorsque la vue est créée et affichée pour la première fois.Aide Pls.Toutes les idées?
Pourquoi pensez-vous que la méthode avant rendu d'un contrôle n'est appelée qu'une seule fois? Avez-vous un exemple de code?
J'ai créé un rapide et sale exemple sur jsbin ( http://jsbin.com/qikokayo/1/edit?html,output ) pour que vous puissiez y jeter un œil. Cela montre clairement que onInit
est appelé une fois mais onBeforeRendering
est appelé à chaque fois ...
Voir également cet extrait du SDK OpenUI5 qui explique:
Crochets de cycle de vie
onInit()
- Appelé lorsqu'une vue est instanciée et que ses commandes (si disponibles) sont déjà créées. Peut être utilisé pour modifier la vue avant qu'elle ne s'affiche pour lier les gestionnaires d'événements et effectuer une autre initialisation unique.
onExit()
- Appelé lorsque la vue est détruite. Utilisez celui-ci pour libérer des ressources et finaliser les activités.
onAfterRendering()
- Appelé lorsque la vue a été rendue (donc son HTML fait partie du document). Les manipulations post-rendu du HTML peuvent être effectuées ici. Ce hook est le même que celui que les contrôles SAPUI5 obtiennent après avoir été rendu.
onBeforeRendering()
- Est invoqué avant que la vue du contrôleur ne soit restituée. Vous utiliseriez onInit () dans le cas où le hook ne sera invoqué qu'avant le premier rendu.Pour les contrôleurs sans vue, aucun crochet de cycle de vie ne sera appelé.
Pour une application moderne de style fiori SAPUI5 impliquant un Component
et un routing
associé, vous pouvez toujours attacher une méthode à votre vue qui serait appelée chaque fois qu'il y a correspondance avec le modèle d'itinéraire fourni pour cette vue . Cette route était historiquement fournie dans la metadata
de la classe Component
mais depuis v1.30
il est déclaré dans le manifest.json
fichier.
Dans la méthode onInit
de votre vue, vous pouvez faire:
onInit: function() {
this._oRouter = this.getOwnerComponent().getRouter();
this._oRouter.getRoute("yourRouteForThisView").attachPatternMatched(this._onObjectMatched, this);
}
Vous avez donc le _onObjectMatched
méthode qui serait appelée chaque fois que vous êtes dans la vue. Ici, vous pouvez placer ici tout votre code qui devrait s'exécuter avant le rendu de votre vue.
_onObjectMatched: function(oEvent) {
var oArgs = oEvent.getParameter("arguments");
//If any values were passed in the URL then those will be available in oArgs
//Do other stuff here
}
Vous pouvez également l'utiliser pour votre page de destination. La première vue a généralement une chaîne vide ""
comme modèle de route dans le manifest
.
Un autre modèle est comme ci-dessous (avec merci à Matbtt)
onInit : function () {
//...other code
var router = this.getOwnerComponent().getRouter();
var target = router.getTarget("<your route target name>");
target.attachDisplay(this.onDisplay, this);
},
/** Fires evey time view is displayed.
*
* @param oEvent
*/
onDisplay: function(oEvent) {
console.log('refreshData')
this._refreshData()
},
La fonction onDisplay est déclenchée chaque fois que la vue est affichée. Dans ma propre petite expérience, les événements de rendu sont déclenchés plus fréquemment qu'on ne le supposerait initialement.
J'ai résolu le problème avec onBeforeShow
. Merci Jason pour vos efforts.