2016-03-21 17 views
0

Verileri denetleyiciye yükleyemiyorum, undefined dönüş.AngularJS: Veri denetleyicideki json'u fabrikadan yükle

app.factory('factoryLlamada', function($http,$q) { return{ 
    cargar: function(archivo) { 
     var deferred = $q.defer(); 
     $http.get(archivo).success(function(data) { 
      deferred.resolve(data); 
     }) 
     .error(function(error) { 
      deferred.reject(error); 
     }); 
     return deferred.promise; 
    } 
}}); 

Ve bu denetleyicisi: Sorunun hangi bilmiyorum

app.controller('ctrlProducts', function(factoryLlamada) { 
    this.saludo = 'Hola'; //this work's 
    factoryLlamada.cargar('prueba.json').then(function(data) { 
     this.datos = data; 
     console.dir(data); //return json object (ok) 
     console.dir(datos); //return undefined 
    }) 
    .catch(function(error) { 
     console.log('Se ha producido un error: '+error); 
    }); 
}); 

...

cevap

3

geri arama işlevi içinde this

Bu fabrika hizmeti kontrolöre başvurmaz. yerine

Yaz:

app.controller('ctrlProducts', function(factoryLlamada) { 
    var vm = this; 
    vm.saludo = 'Hola'; //this work's 

    factoryLlamada.cargar('prueba.json').then(function(data) { 
     vm.datos = data; 
     console.dir(data); //return json object (ok) 
     console.dir(vm.datos); 
    }) 
    .catch(function(error) { 
     console.log('Se ha producido un error: '+error); 
    }); 
}); 

Ve bu arada

, fabrikada sen $q sözler kullanmak zorunda değilsiniz. Sadece $http.get tarafından döndürülen sözünü yeniden ve kod çok özlü olacaktır:

app.factory('factoryLlamada', function($http) { return{ 
    cargar: function(archivo) { 
     return $http.get(archivo); 
    } 
}}); 

Ve böyle veri almak:

diye belirtiyor beri zaten yorumların this.saludo = içinde işe alışkanlık
factoryLlamada.cargar('prueba.json').then(function(response) { 
    // data is in response.data 
}); 
+0

" Hola "çalışır" – amanuel2

+0

"this" den "this.saludo", geri bildirimin dışında olduğu için denetleyiciye başvurur. Ama bu, this.datos için geçerli değil. –

+0

Bu cevap doğru. $ Kapsamı yerine 'this' kullanarak dikkatli olmalısınız. Bu durumda iç içe işlevdeki 'bu', denetleyicideki 'bu' ile aynı değildir. – jbrown