У меня есть настройка «Services.Module», которая знает о службах для инъекций.Он загружается в app.module в разделе import.Все работает, и приложение прекрасно работает с вызовами к конечным точкам на нескольких сервисах.Однако в службе авторизации у меня есть вызов, подобный следующему:
@Injectable()
export class AuthService {
private endpoint = `${environment.baseApi}/auth`;
private headers: HttpHeaders = new HttpHeaders().set('Content-Type', 'application/json');
//Can set this to a regular instance variable and same problem occurs
public static jwt: JWT;
constructor(private http: HttpClient) { }
public createAuthToken(user: UserModel): Observable<JWT> {
return this.http.post<JWT>(`${this.endpoint}/createUserToken`, user, { headers: this.headers})
}
get getJWT() {
return AuthService.jwt;
}
}
Я вызываю его с помощью компонента входа, такого как:
.subscribe((str: string) => {
...
var u = ...
this.authService.createAuthToken(u)
.subscribe((jwt: JWT) =>
{
//works just fine
AuthService.jwt = jwt;
this.router.navigate(['/Category']);
})
Для маршрутов настроена защита маршрута следующим образом:
path: 'Category',
canActivate: [LoginGuard],
component: CategoryComponent
Охранник получает удар и все в порядке, когда мир загружается, как показано ниже:
@Injectable()
export class LoginGuard implements CanActivate, CanLoad {
constructor(private authService: AuthService,
private router: Router) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.checkLoggedIn(state.url);
}
canLoad(route: Route): boolean {
return this.checkLoggedIn(route.path);
}
checkLoggedIn(url: string): boolean {
console.log(`jwt is: ${this.authService.getJWT}`);
if(this.authService.getJWT != null) {
return true;
}
console.log("Must be logged in first");
this.router.navigate(['/login']);
return false;
}
}
Проблема в том, что если я нахожусь в браузере, а затем вручную(root) / Category Статическая переменная 'jwt' в AuthService установлена в неопределенное значение. Если я хочу сохранить переменную, которую я могу установить и сбросить ГЛОБАЛЬНО, и ОТКАЗАТЬ ЕГО, не превращая ее в экземпляр, который будет сброшен для охраны, какова лучшая практика в Angular 6? Я в основном хочу просто уйти 'теперь вы бла-бла, пока я не обновлю браузер или не перезапущу приложение, я ожидаю, что ваше состояние останется прежним.