【问题标题】:AngularJS: Load data json in controller from factoryAngularJS:从工厂加载数据 json 在控制器中
【发布时间】:2016-03-21 10:36:13
【问题描述】:

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

我有这个工厂服务:

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

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

【问题讨论】:

    标签: angularjs json controller factory angular-promise


    【解决方案1】:

    回调函数内部的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返回的promise,代码就会简洁很多:

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

    【讨论】:

    • 这行不通,因为他在 cmets 中已经声明 this.saludo="Hola" 有效
    • 来自this.saludo 的this 指的是控制器,因为它在回调之外。但this.datos 并非如此。
    • 这个答案是正确的。你必须小心使用 'this' 而不是 $scope。在这种情况下,嵌套函数中的“this”与控制器中的“this”不同。
    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多