Cómo acceder a la fecha resuelta dentro del alcance raíz
-
21-12-2019 - |
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.
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: -)