2014-05-21 40 views
8

Ben angularjs için yeni ve benim ilk kullanıcı yapılandırması yükleyen bir hizmeti diğer fonksiyonlar önce servis işlevini çalıştırmakangularjs

angular.module('myApp').service('myService', ['$http', function ($http) { 
    var self = this; 
    self.user = {}; 

    self.loadConfiguration = function() { 
     $http.get('/UserConfig').then(function (result) { 
      self.user = result.data; 
     }); 
    }; 

    self.loadConfiguration(); 
}]); 

Ben bu hizmetin

angular.module('myApp').controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    var self = this; 

    // calculation based on service value 
    self.something = myService.user.something * something else; 
}]); 

gelen yapılandırmayı kullanan bir denetleyici var Burada sorun, bu kod çağrıldığında AJAX isteğinin tamamlanamaması nedeniyle myService.user.something undefined olabilir. Başka bir kod çalıştırılmadan önce hizmetin tamamlanmasını sağlamanın bir yolu var mı? 'LoadConfiguration' hizmet işlevinin, yalnızca ona bağlı olan denetleyicilerin sayısına bakılmaksızın çalıştırılmasını istiyorum.

cevap

5

Eğer denetleyicideki kodunuzun AJAX çağrısı döndükten sonra çalıştırıldığından emin olmak istiyorsanız, olayları kullanabilirsiniz. hizmetinizdedir

bunu kullanın: Kumandanızda olarak

angular.module('myApp').service('myService', ['$http', '$rootScope', function ($http, $rootScope) { 
    var self = this; 
    self.user = {}; 

    self.loadConfiguration = function() { 
     $http.get('/UserConfig').then(function (result) { 
      self.user = result.data; 
      $rootScope.$broadcast('myService:getUserConfigSuccess'); 
     }); 
    }; 

    self.loadConfiguration(); 
}]); 

:

angular.module('myApp').controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    var self = this; 

    $scope.$on('myService:getUserConfigSuccess', function() { 
     // calculation based on service value 
     self.something = myService.user.something * something else; 
    }) 
}]); 

Hatta olaya bir nesne ekleyebilirsiniz.

Lütfen bkz. https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope.

+1

Cevabınız çoğunlukla işe yarıyor. Hizmetin denetleyicinin başlatılmasından önce yüklenmiş olması durumunda çalışmaz, çünkü $ kapsamı. $ On ('myService: getUserConfigSuccess') asla yanmaz. –

+0

@ user1 Ahhhh, evet! Bu nedenle, emin olmak istiyorsanız, 'loadConfiguration()' işlevini denetleyicinizden çağırabilir veya denetleyiciye "user" yüklüyse bir kontrol ekleyebilirsiniz (eğer varsa, kullanın; eğer değilse, bir olay dinleyicisi ekleyin). –

+0

Evet, işim bitti. :) Bundan birkaç ay sonra okuyan herkese yardımcı olmak için kabul edilen cevapların bir kaydını bırakmak istedim. –

5

Sen

Run Blokları

Çalıştır blokları ana yönteme Açısal en yakın şey vardır .run() işlevi içinde servis yöntemini çağırabilirsiniz. Bir çalıştırma bloğu, uygulamasını başlatmak için çalışması gereken koddur. Tüm servisler yapılandırıldıktan ve enjektör oluşturulduktan sonra yürütülür. Çalıştırma blokları tipik olarak kodlu test için zor olan bir kod içerir ve bu nedenle izole modüllerde bildirilmelidir, böylece birim testlerinde göz ardı edilebilirler.

https://docs.angularjs.org/guide/module

ajax gecikme ile başa çıkmak için
angular.module('myApp').run(function()){ 
    //use your service here 
} 

Tek yön

, tüm kontrolörler için özel olayı yayınlayan hangi $ http.success üzerinde $rootScope.$broadcast() fonksiyonunu kullanmaktır. Antoher yolu, vaatleri kullanmak ve çözümlendikten sonra denetleyicilerin eylemlerini gerçekleştirmektir. Bazı fikirler: https://groups.google.com/forum/#!topic/angular/qagzXXhS_VI/discussion

+0

En İyi Seçim! ^^ Yardım için teşekkürler :) –