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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top