2013-10-09 20 views
51

AngularJS uygulamamın başlangıcında bazı JavaScript kodlarını çalıştırmamın bir yolu var mı? Uygulama yönergelerinden/denetleyicilerinden herhangi birinin önce çalıştığından emin olmak için bazı ortak kodlarım var. Rotalara ve ng-view'a bağlı olmak istemiyorum, bunun için ng-app'un genel bir çözümü olması gerekiyor.Açısal uygulamanın başlangıcında kodu çalıştırma

Modül Yapılandırması'nı kullanabileceğimi düşündüm ve aslında bunu denedim, ancak bir hizmeti çağırmaya çalışıyorum, bu da Modül Yüküne erişmenin imkansız gibi görünüyor.

cevap

75

,

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

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

Bu bana denetleyicileri içine aramalar için yarış koşulları verir. Fonksiyon yürütüldüğünde tüm kontrol cihazlarının hazır olmadığı görülmektedir. – Dan

+0

@Dan, denetleyicilerinizde çözüm kullanıyor musunuz? – lyyons

+0

@lyyons Bu sadece rota için işe yaramaz mı? – Dan

3

Sen Modülü API "run" işlevini kullanabilirsiniz: http://docs.angularjs.org/api/angular.Module

Bu kod enjektör oluşturulduktan sonra idam edilecektir Kullanmak isteyen hizmet almak mümkün olmalıdır böylece. Böyle yapabilirsiniz

23

Kısa versiyon

Sen gerçek yöntem hizmetlerine bağlı olabilir module.run(initializationFn) fonksiyonunu kullanmak gerekir. Sen her zamanki gibi bağımlılıkları enjekte edebilir

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

örnek $rootScope üzerinde başlatma bağımlı vardır, ama aynı zamanda, hizmet enjekte vb

daha uzun sürüm

The relevant module.run documentation, oldukça kısa ve öz olarak diğer (mükemmel) cevaplar. Bana bir daha ayrıntılı örnek haline birleştirmek edelim, o da senin initializationFn bir factory oluşturulan hizmet enjekte etmek gösterir:

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

daha uzun süredir daha iyi ve neden? – Xsmael

+0

uzun versiyonunda '' service'' yerine 'this' kullanabilir miyim? ve sonra hiçbir şey döndürmüyor musunuz? Bu aynı şekilde çalışır mı? – Xsmael

+0

Daha uzun versiyon sadece açıklamanın * daha uzun versiyonudur *. Her iki versiyonun mekaniği tamamen aynıdır. – Jeroen

İlgili konular