2016-09-06 127 views
0

我创建了一个对象并为其设置了一些函数,我的问题是,我可以在附加到它的函数内更改此对象的属性值吗?更改自己对象中函数内部对象的属性

这里是我的代码:

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的值,当用户登录到系统中,是可以此登录功能里面?

任何帮助,将不胜感激。

+3

也许我误解了你的问题,但你不能只在成功回调之前做service.isUserAuthenticated = true? – zangarmarsh

+0

确定为什么你不能只设置:service.isUserAuthenticated = true – kjonsson

+0

你读过哪些问题?请链接它们。 – Bergi

回答

1

在绑定loginservice你有,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); 
    }); 
}