2014-04-29 19 views
5

Ho il seguente codice sotto il mio AngularJS .run che funziona perfettamente sul mio computer di sviluppo locale ma non funzionerà quando caricato sul mio server client ... dopo alcuni test è ovvio che nel momento in cui viene caricato il controller l'evento non viene ancora attivato, quindi la maggior parte delle funzioni nel controller a seconda di questo evento non funzionano. Qualcuno può dirmi per favore cosa sto facendo male qui e come risolverlo? Grazie

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

risposta

8

Hai sempre una condizione di gara. Ho un paio di alternative che puoi fare:

1) Utilizzare un servizio. Non sono davvero un fan di questa opzione perché porta al codice Spaghetti. E la maggior parte delle volte non vuoi che il controller funzioni finché non hai effettuato l'accesso. Io preferisco l'opzione 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) Utilizzare un route.resolve. Le risoluzioni sono definite sulla rotta e il controllore caricherà solo una volta che la promessa è stata impostata per essere risolta. Ti ho mostrato un esempio per ui-router e ng-route devi scegliere il tuo veleno. Se non usi ui-router dovresti prenderlo in considerazione.

/* 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

Grazie mille, opzione # 2 è risolto – MChan

Problemi correlati