2013-07-19 11 views
13

Ho risolto il problema lavorando al mio routeprovider ma ho appena restituito la promessa quindi non so se il suo successo o fallimento. Questo è quello che hoAngularJS: Risolve in RouteProvider - rilevamento del successo/fallimento?

.when('/items', { 
    templateUrl: 'views/items.html', 
    controller: 'ItemsCtrl', 
    resolve: { 
     resolvedData: function(Restangular) { 
      return Restangular.one('Items').get(); 
     } 
    } 
}) 

Ora questo funziona, ma come faccio a rilevare il successo o il fallimento ... potrei entrare in questo determinazione nel metodo, ma quello che ci tornerei per il successo e il fallimento ... Ricordando Ho bisogno di avere l'oggetto iniettato nel mio controller.

.when('/items', { 
    templateUrl: 'views/items.html', 
    controller: 'ItemsCtrl', 
    resolve: { 
     resolvedData: function(Restangular) { 
      Restangular.one('Items').get().then(function(data) { 
       // success 
      }, function() { 
       // failure 
      }); 
     } 
    } 
}) 

ho fatto vedere un esempio qui, ma sono confuso se questo è quello che mi serve e come si usa?

AngularJS - rejected $http promise with $routeProvider:resolve

Sembra di tornare una promessa manuale.

resolve: { 
    response: ['Warranty' 
     '$q', 
     function(Warranty, $q) { 
      var dfd = $q.defer(); 
      Warranty.sendRequest().then(function(result) { 
       dfd.resolve({ 
        success: true, 
        result: result 
       }); 
      }, function(error) { 
       dfd.resolve({ 
        success: false, 
        reason: error 
       }); 
      }); 
      return dfd.promise; 
     } 
    ] 
} 

Apprezzerei molto qualsiasi aiuto che qualcuno ha.

Quello che voglio veramente fare è che nel mio controller abbia la variabile risolta iniettata nel controller, se fallisce allora vorrei anche avere accesso al guasto nel controller in modo da poter mostrare all'utente che non era 'possibile eseguire il rendering a causa di un problema.

risposta

10

Si può solo restituire il valore di ritorno del metodo then:

resolve: { 
    resolvedData: function(Restangular){ 
     return Restangular.one('Items').get().then(function (data) { 
      ... 
      return successData; // resolvedData will be resolved with the successData 
      }, function() { 
      ... 
      return failureData; // resolvedData will be resolved with the failureData 
      }); 
    } 
} 

Il then metodo doc:

Questo metodo restituisce una nuova promessa che si risolve o rifiutato tramite il valore di ritorno di il successCallback o errorCallback.

+1

Ah, va bene, e nel mio controller come potrei identificare se il valore che sto iniettando è il successo o il fallimento ?? – Martin

+2

Restituisce un oggetto come {success: true, data: ...} –

2

Se la funzione di risoluzione non riesce, probabilmente si vorrà visualizzare all'utente qualcosa di conseguenza (come un messaggio di errore). Sarebbe meglio lasciare che la funzione risoluzione restituisca una promessa (senza then) e utilizzare l'evento interno $routeChangeError.

myApp.run(['$rootScope',function($rootScope) { 
    $rootScope.$on('$routeChangeError', function() { 
    // what you want to do if an error occurs 
    // ex: $rootScope.displayErrorMessage = true 
    }); 

])

Sarà anche più facile da trattare con errore generico (come errore/server di rete verso il basso, ecc).

Problemi correlati