Bạn sẽ luôn có điều kiện chủng tộc. Tôi có một vài lựa chọn thay thế mà bạn có thể thực hiện:
1) Sử dụng dịch vụ. Tôi không thực sự là một fan hâm mộ của tùy chọn này bởi vì nó dẫn đến mã Spaghetti. Và hầu hết thời gian bạn không muốn bộ điều khiển chạy cho đến khi bạn đăng nhập. Tôi thích tùy chọn 2.
myApp.run(['AuthDataSvc', '$rootScope', function (AuthDataSvc, $rootScope) {
AuthDataSvc.getAuth(); /* no op we will use the service to determine logged in */
}]);
/* inside a controller */
if(AuthDataSvc.isLoggedIn()){
//do something.
}
2) Sử dụng một route.resolve. Các resolves được định nghĩa trên route và Controller sẽ chỉ load khi nó đã được thiết lập để giải quyết. Tôi đã chỉ cho bạn một ví dụ cho ui-router
và ng-route
bạn cần phải chọn chất độc của mình. Nếu bạn không sử dụng ui-router
bạn nên xem xét nó.
/* app.config ... route config.. */
var waitForLogon = {
UserToken: ["AuthDataSvc", function (AuthDataSvc) {
return AuthDataSvc.logon();
}]
};
//this is for ng-route
$routeProvider
.when('/Book/:bookId', {
templateUrl: '--',
controller: 'MyCtrl',
resolve: waitForLogon
})
//this is for ui-router
$stateProvider
.state('me', {
templateUrl: '--',
controller: 'MeCtrl',
resolve: waitForLogon
})
/* controller */
angular.module('yourapp')
.controller('MyCtrl', ["UserToken", ... , function(UserToken){
//User Token will always be here when your Ctrl loads.
});
/* service code -- */
angular.module('yourapp')
.service('AuthDataSvc', ["LogonModel", "$q", function(LogonModel, $q) {
this._q = null;
var that = this;
this._doAuth = function(){
this.getAuth().then(function(Token){ that._q.resolve(Token) }, function(error){that._q.reject(error);}
};
this.logon = function() {
if(!this._q){
this._q = $q.defer();
this._doAuth();// <-current auth do here, and resolve this._q when done
}
return this._q.promise;
};
});
Thanks a lot, Lựa chọn # 2 giải quyết nó – MChan