2014-12-09 32 views
6

Bir hizmet kullanarak global olarak /api/login.json değerini kaydetmek istiyorum, ancak bir çeşit zamanlama sorunum olduğunu düşünüyorum. Denetleyicideki console.log deyimi, scope.login nesnesinin undefined olduğunu söyler.Köşeli fabrikada http hizmetinden veriler nasıl depolanır

Neyi eksik?

Teşekkürler!

Fabrika hizmeti:

myApp.factory('LoginFactory', ['$http', function($http){ 

    this.data; 
    $http.get('/api/login.json').success(function(data) { 
     this.data = data; 
    }); 

    return { 
     getData : function(){ 
     return this.data; 
    } 
    } 
}]); 

Denetleyici: muhtemelen bu bağlamda this anahtar kelimenin kullanılmasına kaçınmalıdır

myApp.controller('AccountsCtrl', ['$scope', 'Accounts', 'LoginFactory', function($scope, Accounts, LoginFactory){ 
    $scope.login = LoginFactory.getData(); 
    console.log('$scope.login: %o', $scope.login);  
    $scope.accounts = Accounts.index(); 

}]); 
+1

sorun olabilir bu anahtar kelimenin bağlam dışından get içinde farklı olmasıdır hiçbir veri değişken –

+0

ben var'ing çalıştı sadece var neden ... almak veri değişkenini (var data = {};), ancak herhangi bir etkisi olmadı, şu anda sadece boş nesneyi alıyorum. – henrik242

+0

elbette varsayı bu kadar basit değil, bu anahtar kelime her yerde kaldırmak ve başarı fonksiyonunun yerel değişkeninin adını değiştirmek zorunda –

cevap

8

. sadece yeni bir değişken bildirmek için daha iyi.

myApp.factory('LoginFactory', ['$http', function ($http) { 
    var data; 
    $http.get('/api/login.json').success(function (d) { 
     data = d; 
    }); 
    return { 
     getData: function() { 
      return data; 
     } 
    }; 
}]); 

yine olsa bir yarış sorunu olacak, bu yüzden bile koşullu son iki yaklaşım gerektirir

myApp.factory('LoginFactory', ['$http', function ($http) { 
    var data; 
    return { 
     getData: function (callback) { 
      if(data) { 
       callback(data); 
      } else { 
       $http.get('/api/login.json').success(function(d) { 
        callback(data = d); 
       }); 
      } 
     } 
    }; 
}]); 

olsun ben de

myApp.factory('LoginFactory', ['$http', function ($http) { 
    var promise = $http.get('/api/login.json'); 
    return { 
     getData: function (callback) { 
      promise.success(callback); 
     } 
    }; 
}]); 

veya zincirleme ya sözünü öneriyoruz denetleyicinizi yeniden yazınız

+1

Teşekkürler, sadece denedim ikinci kod bloğunda öneriniz ve iyi çalıştı. Sadece denetleyicide aramayı güncelleştirmem gerekiyordu: LoginFactory.getData (function (sonuç) { $ scope.login = sonuç; }); – henrik242

+0

Denetleyicide değişikliği ekleyebilirseniz, cevabınızı kabul edip onaylarım. Teşekkürler! – henrik242

0

ben böyle yazardı Sen this anahtar kelime ile bir sorunu var ve ayrıca doğru

http.get gelen söz işlememesi:

myApp.factory('LoginFactory', ['$http', function($http){ 

    return { 
     getData : function(){ 
     return $http.get('/api/login.json'); 
    } 
    } 
}]); 


myApp.controller('AccountsCtrl', ['$scope', 'Accounts', 'LoginFactory', function($scope, Accounts, LoginFactory){ 
    $scope.login = LoginFactory.getData().success(function(data){ 
    console.log(data); 
    console.log('$scope.login: %o', $scope.login); 
    }); 

}]); 
+0

OP'nin ajax isteğinin sonucunu önbelleğe almak istediğini düşünüyorum ... ne yazık ki çözümünüz –

+0

@ LoganMurphy'yi doğru yapmıyor. –

3

genişletme @LoganMurphy cevabı. Sözü kullanmak ve hala geri çağrılar eklemek hiç de arzu edilmez. yazma hizmetinin daha iyi bir yolu

myApp.factory('LoginFactory', ['$http', function ($http, $q) { 
    var data; 
    return { 
     getData: function() { 
      if(data) { 
       return $q.when(data); 
      } else { 
       return $http.get('/api/login.json').then(function(response){ 
        data = response; 
        return data; 
       }); 
      } 
     } 
    }; 
}]); 
İlgili konular