Comment attendre un JSONModel.loadData() demande en sapui5 / openui5
Dans sapUI5/openUI5 j'ai un JSONModel je remplir par un fichier à partir du serveur:
var oModel = new JSONModel();
oModel.loadData("http://127.0.0.1/data/config.json");
console.log(JSON.stringify(oModel.getData()));
Les journaux de la console vide oModel puisque la requête est asynchrone.
Comment le faire de manière synchrone console.log()
est appelée après que les données ont été chargés?
OriginalL'auteur Benvorth | 2016-01-20
Vous devez vous connecter pour publier un commentaire.
Synchrone à l'aide de requêtes ajax n'est pas recommandé, car il bloque l'INTERFACE utilisateur et sera probablement entraîner un avertissement s'affiche dans la console.
Vous pouvez joindre au
Modèle.requestCompleted
événement pour accéder à la chargé de manière asynchrone des données:Thats droit. Et comme vous pouvez appeler loadData() plusieurs fois, l'événement peut être déclenché à plusieurs reprises. Il aurait été agréable si loadData() doit retourner une promesse. Mais il semble qu'ils n'aiment pas les promesses de walldorf 😉
Pour la mienne cas particulier, j'ai l'intention de précontrainte pour le modèle global. À partir d'un modèle local, je ne peux pas attachRequestCompleted de modèle à l'échelle mondiale, avant de les charger. Je ne peux pas accès local modèle global de côté.
OriginalL'auteur schnoedel
Le mot-clé que vous cherchez est "Reportée"-objet --> il vous permet d'attendre une requête AJAX dans SAPUI5.
Vérifier SAPUI5 contexte: SAPUI5 Attendre à un report de l'Objet //attendre .done() de la fonction
OriginalL'auteur zYrEx
Vous pouvez utiliser le attachRequestCompleted-auditeur du Modèle [1]
Une autre fonction à utiliser est
Ceci a l'avantage que vous pouvez configurer à la demande avec tous les paramètres que jQuery.ajax accepte [2]
OriginalL'auteur herrlock
Une autre façon d'y parvenir est d'utiliser le
attachEventOnce
méthode de EventProvider.Il est préférable d'utiliser cette méthode lorsque vous avez seulement besoin de réagir à une demande, et non pas tous. Sinon, si vous utilisez
oModel.attachRequestCompleted(...)
, toutes les demandes passent par la même fonction de gestionnaire.Vous pouvez également utiliser la méthode de chaînage pour rendre cela un peu plus facile.
oModel.attachEventOnce(...)
renvoie l'objet qui appelle la méthode, de sorte que vous pouvez charger vos données et gérer le rappel de tous en une seule instruction.Cela va d'abord exécuter la
loadData()
la demande, puis de la console de la réponse lorsque la requête est terminée. Il va seulement utiliser la fonction de rappel la première fois qu'une demande est faite. Les demandes ultérieures ne vais pas aller par le biais de la fonction de rappel.Si vous voulez que TOUTES les requêtes passent par la MÊME fonction de rappel, vous pouvez faire la même chose mais en utilisant
oModel.attachRequestCompleted(...)
Exécute le
loadData()
demande, la console de la réponse, et aussi la console de la réponse de toutes les demandes ultérieures.REMARQUE: soyez prudent en utilisant
this
dans les fonctions de rappel. Si vous ne passez pasthis
en tant que paramètre de laattachRequestCompleted(...)
ouattachEventOnce(...)
méthodes, puisthis
perdre du contexte d'origine en tant que contrôleur, et le hériter du contexte de l'objet de l'appel de la fonction. herrlock réponse montre comment le contexte dethis
changements.Fournisseur de l'événement de Référence de l'API
OriginalL'auteur Kyle
En fait il y a un paramètre dans le
.loadData()
fonction pour créer une synchronisation appel:Voir API-Référence.
Model.requestCompleted
événement pour accéder à la chargé de manière asynchrone des données:oModel.attachRequestCompleted(function() {console.log(oModel.getData());});
oh, wow. S'il vous plaît copiez qu'à une réponse si je peux l'accepter.
OriginalL'auteur Benvorth