Невозможно направить на ту же / текущую страницу в angular с помощью функции защиты маршрута с setTimeout () - PullRequest
1 голос
/ 24 апреля 2020

Мне не удается перейти на ту же страницу, и я не уверен, чего здесь не хватает. Если я удаляю функцию setTimeout, она работает нормально, но не работает с setTimeout.

Можно ли как-нибудь задержать маршрутизацию?

{
    path: 'sample-page',
    component: SamplePageComponent,
    canActivate: [SampleGuard]
  }

Вот мой SamplePage, который просто использует сообщение из параметров маршрута. Файл html просто отображает сообщение.

SamplePage

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-sample',
  templateUrl: './sample-page.component.html',
  styleUrls: ['./sample-page.component.scss']
})
export class SamplePageComponent implements OnInit, OnDestroy {  
  message: string;

  routeParamsSubscription: Subscription;
  constructor(private activatedRoute: ActivatedRoute, private router: Router) {
    console.log(' in constructor');
  }

  ngOnInit(): void {
    console.log('in in ng init');
    this.routeParamsSubscription = this.activatedRoute.params.subscribe(params => {
      this.message = params.message;
    });
  }

  ngOnDestroy(): void {
    this.routeParamsSubscription.unsubscribe();
  }
}

SampleGuard Это просто переходит на ту же страницу 6 раз, а затем возвращает false.

import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class SampleGuard implements CanActivate {
  static count = 0;
  private readonly MAX_RETRY_COUNT = 6; // total 6 seconds
  private readonly WAIT_TIME = 1000; // 1 sec

  constructor(
    private router: Router
  ) {}

  canActivate(): boolean {
      if (
        SampleGuard.count <= this.MAX_RETRY_COUNT
      ) {
        ++SampleGuard.count;

        setTimeout(() => {
          this.router.navigate(['/sample-page', { message : 'message' + SampleGuard.count }]);
        }, this.WAIT_TIME);
        return true;
      } else {
        return false;
      }
    }
  }

Заранее спасибо.

...