繁体   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