2014-06-05 55 views
5

Angular uygulamasıyla ilgili bir sorunum var.Açısal HTTP Döngüye dön

Yüklü kısa kodlar ('tr', 'fr', ...) içeren bir dizim var. Ve temel olarak, Bu dizide Angular'in döngüsel olmasını istiyorum ve her bir değerde HTTP isteğini yapın.

for (var i in $scope.langs) { 
     console.log($scope.langs[i].shortName); 
     $http.get($scope.appURL + $scope.langs[i].shortName + '/api/products/?format=json&resto='+ $scope.restoID) 
     .then(function(res){ 
      $scope.products = angular.fromJson(res.data); 
      window.localStorage.setItem("products-"+$scope.langs[i].shortName, JSON.stringify(res.data)); 
      $scope.products = JSON.parse(window.localStorage.getItem("products-"+$scope.langs[i].shortName)); 
      console.log('LANG = '+ $scope.langs[i].shortName, $scope.products); 
      }); 
} 

ilk günlük gösterir:

fr 
en 

Great! Son günlüğüne iki kez atılır (dizimde 2 şeritim var), harika.

Sorun şu ki, günlükte her iki durumda da, bir fr/api/... ve bir en/api/... olması gerektiğinde aynı dili gösterir./api/...

Açık mı bilmiyorum ... Herhangi bir fikrin var mı?

+0

Bir uyumsuzluk sorunu gibi görünüyor! – Fals

+0

console.log (i); – shaunhusain

+2

@Fals Bu değil. Sorun şu ki, anonim işlevdeki 'i' işlevi, işlevi oluşturma zamanında değil, işlevi yürütme zamanında sınırlıdır ve her zaman son anahtar değerine sahip olacaktır (ör. $ Scope.langs.length - 1') –

cevap

17

Sorun, tüm ajax istekleriniz geri gelmeden önce i değişkeninizin değişmesidir. Bu nedenle, geri bildiriminiz yürütüldüğünde her zaman $scope.langs.length - 1'a eşit olacaktır. $http isteğinizin her birinin etrafında bir kapatma oluşturmak isteyeceksiniz. Açısal, bazı işlevler için şu işlevlere sahiptir:

angular.forEach($scope.langs, function(lang){ 
    // Here, the lang object will represent the lang you called the request on for the scope of the function 
    $http.get($scope.appURL + lang.shortName + '/whatever/you/want', function(res) { 
    // Do whatever you want with lang here. lang will be the same object you called the request with as it resides in the same 'closure' 
    window.localStorage.setItem(lang.shortName, JSON.stringify(res.data)); 
    }); 
}); 
+0

Bunu deneyeceğim, angular.forEach hakkında bir şey bilmiyordum, bu bana kesinlikle yardımcı olacak , Teşekkürler ! – enguerranws

+0

Sorunumu tamamen çözdüm. Teşekkürler ! – enguerranws