在Angular中引用闭包内的服务属性/方法最合适的方法是什么?

时间:2014-08-12 15:10:42

标签: javascript angularjs

我正在创建一个Angular服务,我想知道下面的场景最佳做法是什么。

authModule.service('authService', 
    function($http, $sessionStorage, $window, $q, $rootScope) {

        this.variable1 = true;

        this.processVariable = function () {
            return $http({...}).then(function(response) {
            variable1 = response.data; 
            //line above this will throw an error because it's not scoped

        }, function (reason) {

        });
    }
} 

如果我使用的是Knockout,我会在var self = this;声明上方添加variable1,然后使用self.variable1代替variable1

使用var self = this;是最佳实践,还是使用Angular时有不同的首选方法?

2 个答案:

答案 0 :(得分:2)

您可以将其定义为变量

 var variable1 = true;

如果要将其设置为实例属性this.variable1 = true;

然后你可以这样做: -

      var _that = this; 
      this.processVariable = function () {
        return $http({...}).then(function(response) {
        _that.variable1 = response.data; 
        //line above this will throw an error because it's not scoped

    }, function (reason) {

    });

原因是当您在this承诺的回调中时,$http不会限定为您的服务实例。您还可以使用bind更改回调内的上下文,以使其作用域为服务实例。

但是,当连续进行呼叫时可能存在问题(并且因为服务是一个单独的,它将是相同的this.variable1,你将修改或覆盖最后一个回调的呼叫),不确定你到底是什么尝试做,但最好的办法是从服务中的promise回调中返回数据。

authModule.service('authService', 
    function($http, $sessionStorage, $window, $q, $rootScope) {
      this.processVariable = function () {
        return $http({...}).then(function(response) {
            return response.data; 
            //line above this will throw an error because it's not scoped
        }, function (reason) {
            $q.reject(reason)
        });
    }
} 

答案 1 :(得分:0)

PSL这很好,但是作为角度建议你应该在数组中调用依赖项而不是函数参数,并且还需要返回服务以返回promise。 虽然缩小JavaScript代码依赖性将保持不变。

authModule.service('authService', ['$http', '$sessionStorage', '$window', '$q', '$rootScope', 
function(http, sessionStorage, window, q, rootScope) {
    return this.processVariable = function() {
        return http({...
        }).then(function(response) {
            return response.data;
            //line above this will throw an error because it's not scoped
        }, function(reason) {
            return q.reject(reason)
        });
    }
}]);