AngularJS:从工厂加载控制器中的数据json

时间:2016-03-21 10:36:14

标签: angularjs json controller factory angular-promise

我无法在控制器中加载数据,返回undefined。

我有这个工厂服务:

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

我不知道哪个是问题...

1 个答案:

答案 0 :(得分: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承诺。只需重用$http.get返回的承诺,代码就会非常简洁:

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

并检索如下数据:

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