在綁定login
到service
你有,this
(如果在login
函數體使用)將指service
對象的login
執行期間。但是,在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,功能文字(即)要傳遞的回調.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);
});
}
也許我誤解了你的問題,但你不能只在成功回調之前做service.isUserAuthenticated = true? – zangarmarsh
確定爲什麼你不能只設置:service.isUserAuthenticated = true – kjonsson
你讀過哪些問題?請鏈接它們。 – Bergi