[英]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.