2016-09-06 12 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

あなたが持っているとして、あなたがserviceloginを結合し、thisは(login関数本体で使用している場合)loginの実行中にserviceオブジェクトを参照します。しかし、login関数内で定義され、引き数として.then()に渡された後続のコールバックでは、thisはコールバックが実行された時点でサービスオブジェクトを参照しなくなるため、bindのサービスのために(this)コールバックするか、クロージャーに格納します。他

// 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); 
     }); 
} 

か:したがって、あなたはlogin機能書き直すことができ、あなたの場合は

// 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関数の外で宣言され、trueservice.isAuthenticatedに割り当てることができます。あなたはES6、関数リテラルを使用している場合

また、(すなわち、​​)あなたがfat-矢印表記を使って書くこともでき.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); 
    }); 
} 
関連する問題