簡體   English   中英

更改自己對象中函數內部對象的屬性

[英]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按原樣綁定到servicethis 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM