2013-07-19 13 views
13

Mam postanowienie działające na moim routeprovider, ale właśnie zwrócę obietnicę, więc nie wiem, czy jej sukces lub porażka. To co mamAngularJS: Rozwiązać w RouteProvider - wykrywanie sukcesu/niepowodzenia?

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

Teraz to nie praca, ale jak mogę wykryć sukces lub niepowodzenie ... I może wejść w to metody rozwiązywania, ale to, co chciałbym zwrócić się do sukcesu i porażki ... Pamiętając Muszę mieć przedmiot wstrzyknięty do mojego kontrolera.

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

Widziałem tutaj przykład, ale jestem zdezorientowany, jeśli to jest to, czego potrzebuję i jak z niego korzystać?

AngularJS - rejected $http promise with $routeProvider:resolve

Wydaje się, że powrót do ręcznego obietnicy.

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; 
     } 
    ] 
} 

Byłbym wdzięczny za każdą pomoc, którą ktoś ma.

Co naprawdę chcę zrobić, to w moim kontrolerze mieć zmienną rozstrzygniętą wstrzykniętą do kontrolera, jeśli zawiedzie, to również chciałbym mieć dostęp do awarii w kontrolerze, więc mogę wyświetlić użytkownikowi, że to nie było nie można dokonać renderowania z powodu problemu.

Odpowiedz

10

Można po prostu zwrócić wartość zwracaną przez metodę 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 
      }); 
    } 
} 

then metoda doc:

Metoda ta zwraca nową obietnicę, która jest rozwiązane lub odrzucone przez wartości zwracanej successCallback lub errorCallback.

+1

Ah thats great, a moim kontrolerem, w jaki sposób mogę określić, czy wartość, którą wstrzykiwam jest sukces lub porażka? – Martin

+2

Zwróć obiekt, taki jak {sukces: prawda, dane: ...} –

2

Jeśli funkcja rozstrzygania się nie powiedzie, prawdopodobnie będziesz chciał wyświetlić użytkownikowi coś odpowiedniego (np. Komunikat o błędzie). Lepiej byłoby, aby funkcja rozstrzygnięcia zwróciła obietnicę (bez numeru then) i użyj wewnętrznego zdarzenia $routeChangeError.

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

])

Będzie to również łatwiejsze do czynienia z błędem rodzajowego (jak sieciowym serwerze błędu/dół itp).

Powiązane problemy