Pregunta

En mi aplicación tengo estados que obtienen varios recursos del servidor usando resolve cláusula.

También tengo un global controlador que necesita acceso a estos recursos.Por ejemplo, considere una ruta de navegación que debe mostrar algunos datos de estos recursos.

¿Cómo puedo acceder a estos recursos desde el controlador global?Incluso si tengo el objeto de estado a mano, no puedo entender cómo extraer las propiedades resueltas.

EDITAR:Estoy usando enrutador ui paquete para enrutamiento.

¿Fue útil?

Solución 2

La idea es agregar una clave de resolución que dependa de los datos requeridos (ver breadcrumb en el código siguiente).Cuando se invoca la función de esta tecla, podemos estar seguros de que nuestros datos item está listo para usar.Luego lo ponemos en el estado (data propiedad).

.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'
}

Para consumir los datos en el controlador global, simplemente examinamos $state.current.data.

Otros consejos

Como lo entiendo, tienes algo así:

  .when('/', {
    controller: 'HomeCtrl',
    templateUrl: 'home.html',
    resolve: {data: someDataFetcher}
  })

y necesita acceder a los datos en un controlador global.Tendría que ver un ejemplo de código para entender perfectamente lo que quiere, pero sugeriría usar un servicio compartido.

function HomeCtrl (data, myDataService) {
  myDataService.data = data;
}

function GlobalCtrl (myDataService) {
  myDataService.data // => The data
}

Un servicio tiene solo una instancia, por lo que es fácil usar eso para compartir estados y recursos en todos los controladores.

Espero que esto ayude.

update :

Crear un cierre de resolución:

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;
     })
    }
  })

Así que básicamente pasa en el resolutivador específico que necesita para obtener ese DATOS.La "MyResolvecLosure" envolverá una función alrededor del resolutor, pasando $ P a la resolución específica para hacer algo de recuperación.Luego tomará los datos resueltos de la resolución específica y lo pasarán al controlador global, luego se resolverá para que cualquier controlador que haya especificado también obtenga los datos.

Espero que esto tenga sentido: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top