Почему не работает условие из местного хранилища? - PullRequest
0 голосов
/ 16 октября 2018

В компоненте шаблона AppComponent, в зависимости от значения, переменная this.loggedInService.isLoggedIn переключается между методами logIn() и logout(), которые в компоненте приложения AppComponent подписаны на эти методы в службе LoggedinService и в зависимости от метода измените значение переменной на true или false.

Также в методе Guard checkLogin (url: string) Я возвращаю true или false в зависимости от значения переменной this.loggedInService.isLoggedIn

Все работает, но когда я перезагружаю страницу, мне нужно сохранить значение кнопки ввода или вывода.Я пытаюсь сделать это в методах login() и logout() в сервисе, но после перезагрузки страницы изменения по-прежнему не сохраняются.Помогите решить эту проблему, чтобы изменения остались после перезагрузки страницы.

шаблон AppComponent:

          <li class="nav-item">
                <a class="btn btn-outline-success"
                   [class.btn-outline-success]="!this.loggedInService.isLoggedIn"
                   [class.btn-outline-danger]="this.loggedInService.isLoggedIn"
                   (click)="this.loggedInService.isLoggedIn ? logout() : logIn()">
                    {{this.loggedInService.isLoggedIn ? 'Exit' : 'Enter'}}
                </a>
            </li>

код AppComponent:

export class AppComponent implements OnInit {

constructor(private loggedInService: LoggedinService,
            private router: Router) {
}

ngOnInit() {}

logIn(): void {
    this.loggedInService.login();
    if (this.loggedInService.isLoggedIn) {
        let redirect = this.loggedInService.redirectUrl ? this.loggedInService.redirectUrl :
            '/gallery';
        this.router.navigate([redirect]);
    }
}

logout(): void {
    this.loggedInService.logout();
    this.router.navigate(['/']);
}
}

LoggedinService:

export class LoggedinService implements OnInit {
    isLoggedIn: boolean = false;
    redirectUrl: string;

    constructor() {

    }

    ngOnInit() {
        this.CheckAuthentication();

    }
    enter code here
    CheckAuthentication(): boolean {
        if (localStorage.getItem('login') === 'true') {
            return this.isLoggedIn = true;
        } else if (localStorage.getItem('login') === 'false') {
            return this.isLoggedIn = false;
        }
    }

    login() {
        localStorage.setItem('login', 'true')
    }

    logout() {
        localStorage.removeItem('login');
        localStorage.setItem('login', 'false')
    }

AuthGuard:

export class AuthGuard implements CanActivate {
    constructor(private loggedInService: LoggedinService) {
    }

    canActivate(next: ActivatedRouteSnapshot,
                state: RouterStateSnapshot):  boolean{
        let url: string = state.url;
        return this.checkLogin(url);
    }

    checkLogin(url: string): boolean {
        if (this.loggedInService.isLoggedIn) {
            return true;
        } else {
            this.loggedInService.redirectUrl = url;
            return false;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Изменение составляет isLoggedIn, чтобы быть get на основе метода элемента localStorage

export class LoggedinService implements OnInit {

    redirectUrl: string;

    constructor() {}

    get isLoggedIn(): boolean {
       return localStorage.getItem('login') ? true : false;
    }

    login(){
     localStorage.setItem('login','true') 
    }

    logout(){
     localStorage.removeItem('login') 
    }

}

app.component

export class AppComponent {
  constructor(private loggedInService: LoggedinService,
    private router: Router) {
  }

  logIn(): void {
      this.loggedInService.login(); // set the state as login
      let redirect = this.loggedInService.redirectUrl ? this.loggedInService.redirectUrl :
        '/gallery';
      this.router.navigate([redirect]);
  }

  logout(): void {
    this.loggedInService.logout(); //// set the state as logout
    this.router.navigate(['/']);
  }
}

демонстрация стекаблиц

0 голосов
/ 16 октября 2018

У меня есть сомнения по поводу вашего кода.

В LoggedInService onInit Почему вы звоните login() и logout() напрямую?

this.CheckAuthentication();
this.login();
this.logout();

Это добавление и удалениеиз вашего localStorage .Кроме того, вы можете проверить данные в локальном хранилище, набрав localStorage в консоли браузера. Я думаю, что вы должны прокомментировать или удалить onInit метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...