[英]Change property on object inside a function in the own object
我创建了一个对象并为其设置了一些函数,我的问题是,我可以在附加到该对象的函数中更改该对象的属性值吗?
这是我的代码:
var service = new Object();
service.login = login;
service.isUserAuthenticated = false;
function login(userName, password, successCallback) {
var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
$http.post($rootScope.baseUrl + 'token', requestBody)
.then(
function (response) {
isUserAuthenticated = true;
successCallback(response);
},
function (response) {
console.log(response);
})
}
我想在用户登录系统时更改isUserAuthenticated的值,在此登录功能内是否可以?
任何帮助,将不胜感激。
当您将login
按原样绑定到service
, this
login
(如果在login
功能的主体中使用)将在执行login
期间引用service
对象。 然而,在这里面定义的后续回调login
功能和参数进行传递.then()
this
将不再是指服务对象一旦回调被执行,所以你要么需要bind
服务的( this
)回调的上下文,或者将其存储在闭包中。 因此,您可以重写您的login
功能:
// binding 'this' to the service
function login(userName, password, successCallback) {
var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
$http.post($rootScope.baseUrl + 'token', requestBody)
.then(function (response) {
this.isUserAuthenticated = true;
successCallback(response);
}.bind(this),
function (response) {
console.log(response);
});
}
要不然:
// storing the service as a closure
function login(userName, password, successCallback) {
var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
var self = this;
$http.post($rootScope.baseUrl + 'token', requestBody)
.then(
function (response) {
self.isUserAuthenticated = true;
successCallback(response);
},
function (response) {
console.log(response);
});
}
在您的情况下,后者并不是绝对必要的,因为您已经将服务存储为在login
函数外部声明的变量,并且可以将true
分配给service.isAuthenticated
。
另外,如果您使用的是ES6,则可以使用粗箭头表示法编写的函数文字(即function() { //... }
)作为回调传递给.then()
,并且上下文绑定将自动执行:
function login(userName, password, successCallback) {
var requestBody = 'grant_type=password&username=' + userName + '&password=' + password;
$http.post($rootScope.baseUrl + 'token', requestBody)
.then((response) => {
this.isUserAuthenticated = true;
successCallback(response);
},
(response) => {
console.log(response);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.