tl;dr - app.run は、API を呼び出すたびに $rootScope.variable の値をリセットします。これを回避する方法を見つける手助けが必要です。
AngularJS + ASP.NET Web API セットアップがあります。ログイン API を除くすべての API 呼び出しでトークンを送信するには、AngularJS が必要です。このコードを app.run に配置しました。
.run(function ($rootScope) {
// $rootScope.token = "" // <-- removed this initialization for now
var sendToken = $rootScope.token == null ? "" : $rootScope.token;
$.ajaxSetup({
headers: {
'myToken': sendToken;
}
});
}
ログイン API は応答でトークンを取得します。その値を $rootScope.token に保存し、そのトークンを他のすべての API 呼び出しの HTTP ヘッダーで「myToken」の値として送信します。したがって、loginController は $rootScope を更新できるようにする必要があり、$.ajaxSetup は $rootScope.token の更新された値を取得する必要があります。これは、loginController がトークン値を取得して $rootScope.token を更新する方法です。
.controller('loginController', function($apiFactory, $rootScope) {
$apiFactory.callAPI(
'/api/login/login',
{'username': 'x', 'password': 'y'},
function(apiResponse) {
$rootScope.token = apiResponse.data;
});
})
$apiFactory.callAPI は、実際の API 呼び出しのためにファクトリで作成した標準関数です。
.factory('$apiFactory', function () {
var root = {};
root.callAPI = function (apiName, data, successCB) {
$.ajax({
url: apiName,
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
}).done(function (apiResponse) {
if (apiResponse.error == false) {
successCB(apiResponse);
}
});
}
return root;
}
LoginController は $rootScope.token を正常に更新しますが、次の API 呼び出しを行うと、ajaxSetup を実行するために .run に移動し、$rootScope.token が未定義として検出されます。
これを修正するにはどうすればよいですか? どうもありがとう!