2013-10-09 20 views
51

Esiste un modo per eseguire codice JavaScript all'avvio della mia applicazione AngularJS? Ho un codice comune di cui ho bisogno per assicurarmi le corse prima di qualsiasi direttiva/controller dell'app. Non voglio essere legato alle rotte e ng-view, ho bisogno che questa sia una soluzione generica per qualsiasi ng-app.Esegui codice all'avvio dell'applicazione angolare

Pensavo di poter utilizzare Module Config e in effetti l'ho provato, ma sto provando a chiamare un servizio, che sembra impossibile accedere al carico del modulo.

risposta

75

Si può fare in questo modo,

var app = angular.module('myApp',[]); 

app.run(function($rootScope) { 
    //..... 
}); 
+4

Questo mi dà condizioni di gara per le chiamate verso i controllori. Sembra che non tutti i controller siano pronti quando la funzione viene eseguita. – Dan

+0

@Dan, stai usando le risoluzioni sui tuoi controller? – lyyons

+0

@lyyons Non funziona solo per le rotte? – Dan

3

è possibile utilizzare la funzione "run" dal API Modulo: http://docs.angularjs.org/api/angular.Module

Tale codice verrà eseguito dopo la creazione di iniettore così si dovrebbe essere in grado di ottenere, al servizio si sta cercando da usare.

23

Versione corta

è necessario utilizzare la funzione module.run(initializationFn), dove il metodo effettivo può dipendere da servizi. È possibile iniettare le dipendenze come al solito:

var app = angular 
    .module('demoApp', []) 
    .run(['$rootScope', function($rootScope) { 
     $rootScope.bodyClass = 'loading'; 
     // Etc. Initialize here. 
    }]); 

L'esempio dispone di inizializzazione dipende $rootScope, ma è anche possibile iniettare servizi, ecc

Longer versione

The relevant module.run documentation è piuttosto laconico, come lo sono i altre (eccellenti) risposte. Mi permetta di combinare in un esempio più dettagliato, che dimostra anche come iniettare un servizio creato factory nel initializationFn:

var app = angular.module('demoApp', []); 
 

 
// Service that we'll also use in the .run method 
 
app.factory('myService', [function() { 
 
    var service = { currentItem: { started: new Date() } }; 
 
    
 
    service.restart = function() { 
 
    service.currentItem.started = new Date(); 
 
    }; 
 
    
 
    return service; 
 
}]); 
 

 
// For demo purposes 
 
app.controller('demoCtrl', ['$scope', 'myService', function($scope, myService) { 
 
    $scope.header = 'Demo!'; 
 
    $scope.item = myService.currentItem; 
 
    $scope.restart = myService.restart; 
 
}]); 
 

 
// This is where your initialization code goes, which 
 
// may depend on services declared on the module. 
 
app.run(['$window', 'myService', function($window, myService) { 
 
    myService.restart(); 
 
    $window.alert('Started!'); 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-app="demoApp" ng-controller='demoCtrl' ng-cloak> 
 
    <h1>{{ header }}</h1> 
 
    <p>Current item started: {{ item.started }}</p> 
 
    <p><button ng-click="restart()">Restart</button></p> 
 
</div>

+0

è la versione più lunga e perché? – Xsmael

+0

nella versione più lunga posso usare 'this' invece di' service'? e quindi non restituire nulla? funzionerebbe allo stesso modo? – Xsmael

+0

La versione più lunga è solo la versione più lunga * della spiegazione *. I meccanismi di entrambe le versioni sono esattamente gli stessi. – Jeroen