tl;dr — app.run сбрасывает значение $rootScope.variable каждый раз, когда я вызываю API — мне нужна помощь, чтобы найти способ обойти это.
У меня есть настройка веб-API AngularJS + ASP.NET. Мне нужно, чтобы AngularJS отправлял токен при каждом вызове API, кроме API входа в систему, я поместил этот код в свой 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, а затем хочу отправить этот токен как значение «myToken» в заголовке HTTP всех других вызовов API. Таким образом, 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, он переходит к .run для запуска ajaxSetup и находит $rootScope.token неопределенным.
Что мне делать, чтобы исправить это? Большое спасибо!
$apiFactory
и использовать фабрику в.run
. Но.run
запускается только после запуска вашего углового приложения. Поэтому вы можете сохранить токен в LocalStorage. - person taguenizy   schedule 15.09.2016jquery
AJAX? - person Stepan Kasyanenko   schedule 15.09.2016$.ajax
нужно использовать$http
сервис. - person Stepan Kasyanenko   schedule 15.09.2016'myToken': sendToken;
использует$apiFactory.token
, чтобы сохранить ссылку на него. Посколькуrun
запускается только один раз, вам нужно сохранить ссылку на токен. И сохраните его на контроллере входа в систему с помощью$apiFactory.token = apiResponse.data;
:) - person taguenizy   schedule 15.09.2016run
илиconfig
. - person Stepan Kasyanenko   schedule 15.09.2016token = "abc"
) в apifactory. Затем в .run() у меня есть'myToken': $apiFactory.token
. Затем в loginController я обновляю значение на$apiFactory.token = "def"
. Затем в моем layoutController, где я вызываю другой API, значение, которое он отправляет дляmyToken
(при анализе заголовка), по-прежнему равно abc, а не def. - person Ekta   schedule 15.09.2016