Angular 6: LocalStorage.removeItem не будет работать при закрытии браузера - PullRequest
0 голосов
/ 05 ноября 2018

Я использую localStorage для сохранения пользовательских данных и токенов при обновлении и перемещении между страницами. Я хочу, чтобы когда пользователь закрывал страницу браузера, localStorage очищал все данные. Я использую ngOnDestroy и HostListener, но ни один из них не работает. Это мой код:

РЕДАКТИРОВАТЬ: Я пытался заменить localStorage на sessionStorage, но он тоже не работал. Я обновил код ниже

app.component.ts

export class AppComponent {
  private authUserService: AuthUserService

  // clear sessions after windows is closed
  @HostListener('window:beforeunload', ['$event'])
  beforeunloadHandler(event) {
    this.authUserService.logout();
  }
  
  ngOnDestroy () {
    this.authUserService.logout();
  }
}

Auth-user.service.ts

import { Injectable, OnDestroy } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { Observable, throwError } from 'rxjs';
import { LocalStorage } from '@ngx-pwa/local-storage';
import { SessionStorage } from 'sessionstorage';

export class AuthUserService implements OnDestroy {

  private user: IUser;
  public errorMessage: string;
  isLoginSubject = new BehaviorSubject<boolean>(this.hasToken());

  constructor(private userService: UserService) { }

  // store the session and call http get
  login(id: number) {
    this.userService.getUser(id).subscribe(
      user => {
        this.user = user;
        localStorage.setItem('user', JSON.stringify(this.user));

        sessionStorage.setItem('token', 'JWT');
        this.isLoginSubject.next(true);
      },
      error  => this.errorMessage = <any>error
    );
  }

   // if we have token the user is loggedIn
   // @returns {boolean}
  private hasToken() : boolean {
    return !!localStorage.getItem('token');
  }

  // @returns {Observable<T>}
  isLoggedIn() : Observable<boolean> {
   return this.isLoginSubject.asObservable();
  }

  logout() {
    localStorage.removeItem('user');
    sessionStorage.removeItem('token');
    this.isLoginSubject.next(false);
  }

  ngOnDestroy() {
    this.logout();
  }
}
...