Comment accéder à la date résolue dans la portée racine
-
21-12-2019 - |
Question
Dans mon application, j'ai des états qui récupèrent diverses ressources du serveur en utilisant resolve
clause.
J'ai aussi un mondial contrôleur qui a besoin d’accéder à ces ressources.Par exemple, considérons un fil d'Ariane qui doit afficher certaines données de ces ressources.
Comment puis-je accéder à ces ressources depuis le contrôleur global ?Même si j'ai l'objet d'état sous la main, je n'arrive pas à comprendre comment extraire les propriétés résolues.
MODIFIER:j'utilise ui-routeur paquet pour le routage.
La solution 2
L'idée est d'ajouter une clé de résolution qui dépend des données requises (voir breadcrumb
dans le code ci-dessous).Lorsque la fonction de cette clé est invoquée, nous pouvons être assurés que nos données item
est prêt à l’emploi.Ensuite, nous le mettons sur l'état (data
propriété).
.state('some.item.detail.state', {
url: '/:itemId',
resolve: {
item: function($stateParams, MyServerResource) {
return MyServerResource.get({itemId: $stateParams.itemId}).$promise;
},
breadcrumb: function(item) {
this.data = item;
}
},
templateUrl: 'myTemplate.html'
}
Pour consommer les données dans le contrôleur global, nous examinons simplement $state.current.data
.
Autres conseils
Si je comprends bien, vous avez quelque chose comme ceci :
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {data: someDataFetcher}
})
Et vous devez accéder aux données dans un contrôleur global.Il me faudrait voir un exemple de code pour comprendre parfaitement ce que vous voulez, mais je suggérerais d'utiliser un service partagé.
function HomeCtrl (data, myDataService) {
myDataService.data = data;
}
function GlobalCtrl (myDataService) {
myDataService.data // => The data
}
Un service n'a qu'une seule instance, il est donc facile de l'utiliser pour partager l'état et les ressources entre les contrôleurs.
J'espère que cela t'aides.
mise à jour:
Créez une clôture de résolution :
var myResolveClosure = function (resolver) {
// Return a wrapper around the resolver
return function (globalController, $q) {
var deferred = $q.defer();
resolver($q).then(function (data) {
globalController.addData(data);
deferred.resolve(data);
}).catch(function () {
deferred.reject();
});
return deferred.promise;
}
}
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {
data: myResolveClosure(function ($q) {
var deferred = $q.defer();
// do something and resolve with the data
return deferred.promise;
})
}
})
Donc, fondamentalement, vous transmettez le résolveur spécifique dont vous avez besoin pour récupérer ces données.Le "myResolveClosure" encapsulera une fonction autour du résolveur, en transmettant $q au résolveur spécifique pour effectuer une récupération.Il prendra ensuite les données résolues à partir du résolveur spécifique et les transmettra au contrôleur global, puis se résoudra de manière à ce que tout contrôleur que vous avez spécifié obtienne également les données.
J'espère que cela a du sens :-)