Come accedere alla data risolta all'interno dell'ambito di radice
-
21-12-2019 - |
Domanda
Nella mia app ho affermato che recupera varie risorse dal server utilizzando la clausola resolve
.
Ho anche un controllore Global che richiede l'accesso a queste risorse.Ad esempio, considera un pangrattato che deve mostrare alcuni dati di queste risorse.
Come posso accedere a queste risorse dal controller globale?Anche se ho a portata di mano oggetto di stato, non ho potuto capire come estrarre le proprietà risolte.
Modifica: sto usando ui-router pacchetto per il routing. .
Soluzione 2
L'idea è di aggiungere una chiave di risoluzione che dipende dai dati richiesti (vedere breadcrumb
nel codice sotto).Quando viene invocata la funzione di questo tasto, possiamo essere sicuri che i nostri dati item
siano pronti per l'uso.Quindi lo mettiamo sullo stato (proprietà data
).
.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'
}
.
Per consumare i dati nel controller globale, esaminiamo semplice $state.current.data
.
Altri suggerimenti
Come capisco che hai qualcosa del genere:
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {data: someDataFetcher}
})
.
E devi accedere ai dati in un controller globale.Dovrei vedere un esempio di codice per capire perfettamente quello che vuoi, ma suggerirei di usare un servizio condiviso.
function HomeCtrl (data, myDataService) {
myDataService.data = data;
}
function GlobalCtrl (myDataService) {
myDataService.data // => The data
}
.
Un servizio ha solo un'istanza in modo che sia facile da usare per condividere lo stato e le risorse attraverso i controller.
Spero che questo aiuti.
Aggiornamento :
Crea una chiusura di risoluzione:
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;
})
}
})
.
Così fondamentalmente si passa nel resolver specifico che devi recuperare quei dati.La "MyRoSolveclosure" avvolgerà una funzione attorno al resolver, passando in $ Q al resolver specifico per fare un po 'di recupero.Prenderà quindi i dati risolti dal resolver specifico e passarlo nel controller globale, quindi risolversi in modo che qualsiasi controller specificato abbia anche i dati.
Spero che questo abbia senso: -)