web-dev-qa-db-fra.com

SAPUI5-Quelle méthode appeler une fois qu'une vue est affichée à chaque fois?

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?

9
Papu

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é.

11
Jason Scott

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.

6
Kumar

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.

4
Vanquished Wombat

J'ai résolu le problème avec onBeforeShow. Merci Jason pour vos efforts.

3
Papu