2014-07-17 17 views
12

Tôi đang cố gắng đảm bảo rằng người dùng được xác thực trước khi cho phép họ chuyển sang trạng thái cụ thể. Khi tôi hiểu nó (sau khi xem xét các bài viết khác), một quá trình chuyển đổi trạng thái không nên xảy ra nếu quyết định của tiểu bang trả về một lời hứa bị từ chối và sự kiện '$ stateChangeError' sẽ được nâng lên. Tuy nhiên đây không phải là những gì tôi đang trải qua.Góc giao diện người dùng-Router - Trả lại lời hứa bị từ chối trong giải quyết không dừng chuyển tiếp trạng thái

Bước qua mã sau, tôi có thể thấy rằng lời hứa hoãn lại bị từ chối nhưng quá trình chuyển đổi trạng thái vẫn xảy ra và '$ stateChangeError' không được kích hoạt. Trong cấu hình mô-đun của tôi Tôi có tình trạng sau:

.state('accounts', { 
      url: '/Accounts', 
      controller: 'AccountsController', 
      templateUrl: 'Scripts/angular/accounts/templates/accounts.tpl.html', 
      resolve: { 
       authenticated: ['$q', 'AccountService', function ($q, accountService) { 
        var deferred = $q.defer(); 
        accountService.userLoggedIn().then(function (loggedIn) { 
         if (loggedIn) { 
          deferred.resolve(); 
         } else { 
          deferred.reject('Not logged in'); <-- This happens 
         } 
         return deferred.promise; 
        }); 
       }] 
      } 
     }) 

trong cùng một module, trong hàm chạy tôi có:

$rootScope.$on('$stateChangeError', 
    function (event, toState, toParams, fromState, fromParams, error) { 
     $log.debug(error); <-- This is never called 
     $state.go('login'); 
    }); 

tôi thiếu gì?

Trả lời

18

Bạn đang trả lại lời hứa ở địa điểm sai. Authenticated cần phải được một hàm trả về một lời hứa nhưng bạn chỉ cần trả lại lời hứa trong các .Sau đó() chức năng và sau đó chứng thực đang trở lại undefined:

 resolve: { 
      authenticated: ['$q', 'AccountService', function ($q, accountService) { 
       var deferred = $q.defer(); 
       accountService.userLoggedIn().then(function (loggedIn) { 
        if (loggedIn) { 
         deferred.resolve(); 
        } else { 
         deferred.reject('Not logged in'); <-- This happens 
        } 
       }); 

       return deferred.promise; 

      }] 
     } 
+2

Rất tiếc! Có mắt quan sát. – Nick

6

Bạn không cần phải tạo mới bị trì hoãn kể từ khi bạn đã nhận lời hứa từ userLoggedIn():

resolve: { 
    authenticated: ['$q', 'AccountService', function ($q, accountService) { 

     return accountService.userLoggedIn().then(function (loggedIn) { 
       if (loggedIn) { 
        return loggedIn; 
       } else { 
        return $q.reject('Not logged in'); 
       } 
     }); 

    }] 
} 
+1

Điều này sẽ không ngăn việc định tuyến. Do đó không chính xác –

Các vấn đề liên quan