2014-04-29 24 views
5

Tôi có đoạn mã sau dưới AngularJS .run hoạt động hoàn hảo trên máy phát triển cục bộ của tôi nhưng sẽ không hoạt động khi được tải lên máy chủ khách ... sau vài lần kiểm tra rõ ràng là do thời gian bộ điều khiển được nạp, sự kiện này chưa được kích hoạt nên hầu hết các chức năng trong bộ điều khiển phụ thuộc vào sự kiện này không hoạt động. Ai đó có thể vui lòng cho tôi biết những gì tôi đang làm sai ở đây và làm thế nào để sửa chữa nó? Cảm ơn

myApp.run(['AuthDataSvc', '$rootScope', function (AuthDataSvc, $rootScope) {  
    AuthDataSvc.getAuth().then(function(Token){ 
     $rootScope.$broadcast('Token', Token); 
    }, function(status){ 
     console.log(status); 
    });  
}]); 

Trả lời

8

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-routerng-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; 
     }; 
    }); 
+0

Thanks a lot, Lựa chọn # 2 giải quyết nó – MChan

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