【问题标题】:Setting local variables as result of Ajax call in Factory在工厂中将局部变量设置为 Ajax 调用的结果
【发布时间】:2014-07-21 01:56:36
【问题描述】:

我正在尝试创建一个将 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() 以便指令的每个实例都有自己的关联工厂。

【问题讨论】:

  • 在工厂中使用“this”被误用。检查此帖子是否正确使用:stackoverflow.com/questions/14324451/…
  • 嗯 - 我只是简单地看了看这个,但似乎他们正在为工厂设置全局变量,这些变量将可用于工厂的所有实例,我需要仅可用于每个实例的变量.
  • Factory 和 Services 是单例的——它们是全局的。但是你可以实现一个 getInstance(),每次调用它都会返回一个新对象。

标签: javascript angularjs factory


【解决方案1】:

你需要在then回调中设置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;
});

【讨论】:

    【解决方案2】:

    我相信您正在寻找的是“致电”或“申请”。它将允许您在设置其“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;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2011-03-16
      • 2023-03-16
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多