Angular 在配置中注入 $state 服务以重定向到拦截器中的状态
Angular inject $state service in config to redirect to a state in an interceptor
我正在使用 restangular 并且我有一个拦截器。这个想法是,对于每个响应 401,拦截器应该重定向到不同的状态。
问题是 angular 不允许在配置中注入服务。它只允许注入提供者。
我怎样才能在我的 restangular 拦截器中访问 $state: ng.ui.IStateService
?
我知道我可以注入提供程序 $stateProvider: ng.ui.IStateProvider
但我认为没有任何方法可以从提供程序导航到特定状态。
这是我的:
/// <reference path="../../typings/globals/restangular/index.d.ts" />
((): void => {
"use strict";
angular
.module("app")
.config(configRestangular);
configRestangular.$inject = [
"$state",
"RestangularProvider",
"authSettings",
"stateNames",
"apiUrl"
];
function isCustomValidationErrorResponse(response: restangular.IResponse) {
return (response.data && response.data.customValidationError === true);
}
function configRestangular(
$state: ng.ui.IStateService,
restangularProvider: restangular.IProvider,
authSettings: IAuthSettings,
stateNames: IStateNames,
apiUrl: string) {
// restangular settings
restangularProvider.setBaseUrl(apiUrl);
restangularProvider.setErrorInterceptor((response: restangular.IResponse, deferred: ng.IDeferred<any>) => {
if (response.status === 401) {
$state.go(stateNames.login); //this will fail because $state cannot be injected here and I don't know how to navigate to a different state from $stateProvider
}
return true;
});
}
})();
方法是 - 在 .run()
阶段配置 Restangular.setErrorInterceptor (检查 Restangular
而不是 RestangularProvider
)。在那里我们可以得到预期的$state
另请参阅:
Configuring in the run
// Here I inject the service BaseUrlCalculator which I need
app.run(function(Restangular, BaseUrlCalculator) {
Restangular.setBaseUrl(BaseUrlCalculator.calculate());
});
我正在使用 restangular 并且我有一个拦截器。这个想法是,对于每个响应 401,拦截器应该重定向到不同的状态。
问题是 angular 不允许在配置中注入服务。它只允许注入提供者。
我怎样才能在我的 restangular 拦截器中访问 $state: ng.ui.IStateService
?
我知道我可以注入提供程序 $stateProvider: ng.ui.IStateProvider
但我认为没有任何方法可以从提供程序导航到特定状态。
这是我的:
/// <reference path="../../typings/globals/restangular/index.d.ts" />
((): void => {
"use strict";
angular
.module("app")
.config(configRestangular);
configRestangular.$inject = [
"$state",
"RestangularProvider",
"authSettings",
"stateNames",
"apiUrl"
];
function isCustomValidationErrorResponse(response: restangular.IResponse) {
return (response.data && response.data.customValidationError === true);
}
function configRestangular(
$state: ng.ui.IStateService,
restangularProvider: restangular.IProvider,
authSettings: IAuthSettings,
stateNames: IStateNames,
apiUrl: string) {
// restangular settings
restangularProvider.setBaseUrl(apiUrl);
restangularProvider.setErrorInterceptor((response: restangular.IResponse, deferred: ng.IDeferred<any>) => {
if (response.status === 401) {
$state.go(stateNames.login); //this will fail because $state cannot be injected here and I don't know how to navigate to a different state from $stateProvider
}
return true;
});
}
})();
方法是 - 在 .run()
阶段配置 Restangular.setErrorInterceptor (检查 Restangular
而不是 RestangularProvider
)。在那里我们可以得到预期的$state
另请参阅:
Configuring in the run
// Here I inject the service BaseUrlCalculator which I need
app.run(function(Restangular, BaseUrlCalculator) {
Restangular.setBaseUrl(BaseUrlCalculator.calculate());
});