在Factory中将局部变量设置为Ajax调用的结果

时间:2014-07-21 01:56:36

标签: javascript angularjs factory

我正在尝试创建一个将AJAX调用的结果存储在变量中的工厂。到目前为止,我有以下几点:

angular.module('frontApp')
    .factory('myFactory', function(Restangular) {
        var myFactory = function() {
            this.loadedData = [];
            loadData()
        }   

        var loadData = function() {
            Restangular.all('endPoint').customGET('path/run').then(
                function(success) {
                    this.loadedData = success.results;
                }
            );
        }

        return stoppingPatternFactory;
    });

但我收到错误:cannot set property 'loadedData' of undefined

我理解这个上下文中的this关键字是指函数上下文,这就是我收到错误的原因。问题是当Restangular调用是异步的时候,我无法解决如何在第一个函数中设置this.loadedData的问题。我试过在第一个函数中发出请求并尝试在回调中设置变量,但是我得到了同样的错误。

编辑:我应该补充一点,我正在尝试创建这个工厂的多个实例,例如: var f = new myFactory()以便指令的每个实例都有自己的工厂关联。

2 个答案:

答案 0 :(得分:1)

你需要设置loadedData然后回调

angular.module('frontApp')
.factory('myFactory', function(Restangular) {

    var myFactory = function() {
        var self = this;
        self.loadedData = [];
        loadData().then(function(data){
            self.loadedData =  data;
        })
    }   

    var loadData = function() {
        var restApi = Restangular.all('endPoint')
        return restApi.customGET('path/run').then(
            function(success) {
                return success.results;
            }
        );
    }

    return stoppingPatternFactory;
});

答案 1 :(得分:0)

我相信你要找的是“打电话”或“申请”。它允许您在设置其“this”引用时调用方法。然后,您可以保存该引用并在任何位置设置其属性。这样的事情应该有效。

angular.module('frontApp')
.factory('myFactory', function(Restangular) {
    var myFactory = function() {
        this.loadedData = [];
        loadData.call(this);
    }   

    var loadData = function() {
        var self = this;
        Restangular.all('endPoint').customGET('path/run').then(
            function(success) {
                self.loadedData = success.results;
            }
        );
    }

    return myFactory;
});