为了易读性,我删除了一些东西。
我已经使用 CoffeeScript 类系统编写了用户服务,但是当它尝试访问自己的成员函数时,它给我带来了问题。
User = (...) ->
'ngInject'
new class User
constructor: ->
@setRole()
login: (params) ->
params.grant_type = 'password'
request = {...}
$http(request).then (response) ->
$window.localStorage.token = response.data.access_token
payload = jwtHelper.decodeToken(response.data.access_token)
$rootScope.$broadcast EVENTS.AUTH.LOGIN
@setRole() # PROBLEM LINE
, (response) ->
if response.status == 400
$rootScope.$broadcast EVENTS.ERROR.BAD_REQUEST
...
当我尝试调用@setRole()
时,浏览器通知我 setRole() 不存在:
类型错误: 无法读取未定义的属性"setRole"
这将编译为:
User = [..., function(...) {
'ngInject';
return new (User = (function() {
function User() {
this.setRole();
console.log("User service loaded");
}
User.prototype.login = function(params) {
var request;
params.grant_type = 'password';
request = {...}
};
return $http(request).then(function(response) {
var payload;
$window.localStorage.token = response.data.access_token;
payload = jwtHelper.decodeToken(response.data.access_token);
$rootScope.$broadcast(EVENTS.AUTH.LOGIN);
return this.setRole(); # WRONG this, I PRESUME
}, function(response) {
if (response.status === 400) {
return $rootScope.$broadcast(EVENTS.ERROR.BAD_REQUEST);
}
});
};
...
我的问题是:为什么我无法使用@
表示法在自己的服务中调用User.setRole()?有解决方法吗?我认为这与与用户实例不对应的此指针有关。
问题是在你传递给 then
的函数中,this
变化。要保持相同,请使用胖箭头语法 ( =>
):
$http(request).then (response) =>