2015-03-27 9 views
13

Sto utilizzando la risoluzione del router per ottenere alcuni dati da un servizio.

Il fatto è che ho bisogno di ottenere un valore dal $ scope genitore per chiamare il servizio come mostrato di seguito.

resolve: { 
       contactService: 'contactService', 
       contacts: function ($scope, contactService) { 
        return contactService.getContacts($scope.parentCtrl.parentObjectId); 
       } 
      } 

Continuo a ricevere Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

provato anche un paio di tentativi disperati come l'aggiunta di portata all'oggetto determinazione come mostrato soffietto con non il successo.

scope: $scope 

Qualche idea?

+0

puoi pubblicare il tuo codice in plnkr? – user3722785

+0

Non penso che la mia domanda abbia bisogno di altro codice di spiegazione, voglio semplicemente aggiungere $ scope alla risoluzione del mio ui-router. –

+0

Quello che stai cercando di fare non è possibile. Se è necessario disporre di un valore per eseguire un calcolo nella funzione di risoluzione, deve provenire da un servizio. – Claies

risposta

19

Impossibile impossibile, l'ambito non è stato inizializzato in quel punto, quindi non è possibile utilizzarlo nell'oggetto risoluzione. È possibile accedere all'ambito nel controller dopo che è stato inizializzato. L'intero punto risolutivo è che viene eseguito prima dell'inizializzazione del controller in modo che sia possibile iniettare e accedere direttamente agli elementi risolti nell'ambito.

Se è necessario passare una variabile allo stato successivo, è possibile farlo utilizzando l'oggetto $stateParams che è disponibile per la risoluzione. È possibile aggiungere dati ad esso quando si cambia gli stati, ad esempio:

Nel modello, se si dispone di un objectId nel vostro campo di applicazione:

<a ui-sref="statename({'id': objectId})">Change states</a> 

O nel controller:

$scope.go('statename', {'id': $scope.objectId}); 

Puoi quindi recuperare che nella vostra determinazione utilizzando il $stateParams:

resolve: { 
    contactService: 'contactService', 
    contacts: function ($stateParams, contactService) { 
     return contactService.getContacts($stateParams.id); 
    } 
} 
+0

Esattamente, ma ci sono già ambiti e controller istanziati. Come posso risolvere i dati di un cliente se non ho l'ID del cliente per esempio? –

+0

Si dovrebbe passare questo come parametro allo stato successivo, ad esempio: '$ state.go ('nome'. {Id: 1})' o 'ui-sref = "nome ({id: 1})" ' e quindi iniettare '$ stateParams' nella tua risoluzione per recuperarlo di nuovo e recuperare i dati basati su quello – iH8

+0

Ora stiamo arrivando da qualche parte, grazie per la risposta. –

0

Come un alternativ e alla soluzione accettata, che richiede un altro round trip sul server per la stessa risorsa (se si sta ottenendo il valore dal server/api) si potrebbe $watch il genitore dal controller figlio.

function ParentController($http) { 
    var vm = this; 
    $http.get(someResourceUrl).then(function(res) { 
    vm.someResource = res.data; 
    }); 
} 

function ChildController($scope) { 
    // wait untill the parent gets the value 
    var unwatch = $scope.$watch('parent.someResource', function(newValue) { 
    if (newValue) { 
     // the parent has the value, init this controller 
     init(newValue); 
     // dispose of the watcher we no longer need 
     unwatch(); 
    } 
    }); 
    function init(someResource) { 
    // ... do something 
    } 
} 

function routerConfig($stateProvider) { 
    $stateProvider 
    .state('parent', { 
     url: '/parent', 
     controller: 'ParentController', 
     controllerAs: 'parent', 
     templateUrl: '...', 
    }) 
    .state('parent.child', { 
     url: '/child', 
     controller: 'ChildController', 
     controllerAs: 'child', 
     templateUrl: '...', 
    }); 
} 
Problemi correlati