我正在创建一个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时有不同的首选方法?
答案 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)
});
}
}]);