2016-03-21 8 views
0

コントローラのデータをロードできません。未定義です。AngularJS:工場出荷時のコントローラのデータjsonをロード

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; 
    } 
}}); 

そして、このコントローラ::私は問題であるかわからない

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); 
    }); 
}); 

...

答えて

3

コールバック関数内this

私はこの工場のサービスを持っていますコントローラを参照していません。

が代わりに書く:

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); 
    }); 
}); 

ところで、工場であなたは$q約束を使用する必要はありませんが。

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

そして、このようなデータ取得:彼はthis.saludo =」すでにコメントで述べているので、仕事を文句を言わない

factoryLlamada.cargar('prueba.json').then(function(response) { 
    // data is in response.data 
}); 
+0

をちょうどずっと簡潔になります$http.getによって返さ約束し、コードを再利用ホラー "が動作します – amanuel2

+0

' this.saludo'の 'this'はコントローラがコールバックの外側にあることを示します。しかし、これは 'this.datos'の場合ではありません。 –

+0

この回答は正しいです。 $スコープではなく、 'this'を使って慎重に扱わなければなりません。この場合、入れ子関数の 'this'はコントローラの 'this'と同じではありません。 – jbrown

関連する問題