Angular - routerLink 和状态问题

Xil*_*ilo 2 angular-routing routerlink angular angular-routerlink

我想从一个 html 页面使用 routerLink 和 state 路由到另一个页面。使用标记没有问题,在登录页面的 ngOnInit 期间,我可以按预期检索状态。使用标签主页也可以导航,但状态结果未定义。

我怎么了?

登录页面的html

<button routerLink="/home" [state]="navExtra.state">
    Go Home Page via button
</button>
<a routerLink="/home" [state]="navExtra.state">Go Home Page via a</a>
Run Code Online (Sandbox Code Playgroud)

登录页面的ts

import { Component, OnInit } from '@angular/core';
import { NavigationExtras } from '@angular/router';

@Component({
  selector: 'app-login',
  templateUrl: './login.page.html',
  styleUrls: ['./login.page.scss']
})
export class LoginPage implements OnInit {
  navExtra: NavigationExtras = {
    state: { data: { a: 'a', b: 'b' } }
  };
  constructor() {}

  ngOnInit() {}
}
Run Code Online (Sandbox Code Playgroud)

首页的ts

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'app-home',
  templateUrl: './home.page.html',
  styleUrls: ['./home.page.scss']
})
export class HomePage implements OnInit {
  constructor(
    private router: Router
  ) {}

  ngOnInit() {
    console.log(this.router.getCurrentNavigation().extras.state);
  }
}
Run Code Online (Sandbox Code Playgroud)

AJT*_*T82 7

我认为state通过一个按钮是不可能的。如果我们检查 的源代码routerLink,我们可以看到......

没有一个a标签:

@Directive({selector: ':not(a):not(area)[routerLink]'})
Run Code Online (Sandbox Code Playgroud)

state不包括在extras

@HostListener('click')
onClick(): boolean {
  const extras = {
    skipLocationChange: attrBoolValue(this.skipLocationChange),
    replaceUrl: attrBoolValue(this.replaceUrl),
  };
  this.router.navigateByUrl(this.urlTree, extras);
  return true;
}
Run Code Online (Sandbox Code Playgroud)

来源

而当我们有一个a标签时:

@Directive({selector: 'a[routerLink],area[routerLink]'})
Run Code Online (Sandbox Code Playgroud)

它包括:

@HostListener('click', [/** .... **/])
onClick(/** .... **/): boolean {
  // .....
  const extras = {
    skipLocationChange: attrBoolValue(this.skipLocationChange),
    replaceUrl: attrBoolValue(this.replaceUrl),
    state: this.state // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< here!
  };
  this.router.navigateByUrl(this.urlTree, extras);
  return false;
}
Run Code Online (Sandbox Code Playgroud)

来源

因此,您的选择是将该链接的样式设置为看起来像一个按钮,或者在单击按钮时调用一个执行导航的函数,如其他答案中所示,在这里我请参考AbolfazlR发布的代码

this.router.navigate(['home'], this.navExtra);
Run Code Online (Sandbox Code Playgroud)