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.

Était-ce utile?

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 :-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top