2016-09-06 151 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); 
    }); 
}