Как я могу сообщить компоненту angular, какая кнопка была нажата для маршрутизации к нему?

#angular #typescript

#angular #typescript

Вопрос:

У меня есть угловой компонент, который должен отображать различную информацию в зависимости от того, какая кнопка была нажата для маршрутизации к нему. Если была нажата кнопка 1, я хочу установить button1=true в component2 и использовать ngIf для отображения правильной информации. Если была нажата кнопка 2, я хочу установить button2=true и использовать ngIf для отображения правильной информации.

Два компонента имеют разные URL-адреса и не являются родительскими / дочерними друг для друга.

Приведенный ниже код представляет собой простой пример того, чего я пытаюсь достичь.

Как я могу сообщить компоненту 2, была ли нажата кнопка 1 или кнопка 2?

comp1.component.ts

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

@Component({
  selector: 'app-comp1',
  templateUrl: './comp1.component.html',
  styleUrls: ['./comp1.component.css']
})
export class Comp1Component implements OnInit {

  constructor(private router: Router,) { }

  public onButton1(){
    this.router.navigate(['/comp2']);
  }

  public onButton2(){
    this.router.navigate(['/comp2']);
  }

  ngOnInit() {
  }

}
 

comp1.component.html

 <div>
    <button (click)="onButton1()">Button1</button>
    <button (click)="onButton2()">Button2</button>
</div>
 

comp2.component.ts

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

@Component({
  selector: 'app-comp2',
  templateUrl: './comp2.component.html',
  styleUrls: ['./comp2.component.css']
})
export class Comp2Component implements OnInit {

  public button1 = false;
  public button2 = false;

  constructor() { }

  ngOnInit() {
    // if button pressed == "button1" in component 1
    this.button1 = true

    // if button pressed == "button2" in component 1
    this.button2 = true
  }

}
 

comp2.component.html

 <div *ngIf="button1">
    Button 1 was clicked
</div>

<div *ngIf="button2">
    Button 2 was clicked
</div>

 

app-routing.module.ts

 import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { Comp1Component } from './comp1/comp1.component';
import { Comp2Component } from './comp2/comp2.component';

const routes: Routes = [
  { path: 'comp1', component: Comp1Component },
  { path: 'comp2', component: Comp2Component }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }
 

app.component.html

 <router-outlet></router-outlet>
 

Ответ №1:

Вы могли бы отправить параметр в маршруте, который затем можно было бы получить в компоненте 2 с помощью ActivatedRoute . Если вы ожидаете использовать только 2 кнопки, то это может быть просто логический флаг для обозначения условия. Если нет, вы могли бы подумать об использовании других методов для обозначения состояний (например, перечислений).

Я проиллюстрирую это логическим

Компонент 1

 export class Comp1Component implements OnInit {
  public onButton1(){
    this.router.navigate(['/comp2', {state:true}]);
  }

  public onButton2(){
    this.router.navigate(['/comp2', {state:false}]);
  }
}
 

Компонент 2

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

export class Comp2Component implements OnInit {
  public state = false;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.state = this.route.snapshot.paramMap.get('state');
  }
}
 

Шаблон компонента 2

 <div *ngIf="state; else otherState">
    Button 1 was clicked
</div>

<ng-template #otherState>
    Button 2 was clicked
</ng-template>
 

Ответ №2:

Иметь общую службу, внедренную в оба компонента, знать, какая кнопка была нажата

Обслуживание:

 @Injectable({
  providedIn: 'root'
})
export class Service {
  button1Clicked: false;
}
 

Компонент1:

 constructor(private service: Service){}
public onButton1(){
    // with the injected service
    this.service.button1Clicked = true;
    this.router.navigate(['/comp2']);
  }
 

Затем в вашем другом компоненте вы можете сделать

 constructor(private service: Service){}
ngOnInit(){
  if (this.service.button1Clicked)
     this.button1 = true
}
 

Комментарии:

1. Небольшая синтаксическая ошибка в вашем последнем отрывке кода. Вы помещаете свой код после конструктора. Я предполагаю, что вы хотели поместить его в скобки конструктора. Также вы должны ссылаться на this.service в своем if.

2. Лучше использовать ActivatedRoute, например, ответ @Michael’s

3. @Eliseo зависит от того, где вам это нужно. Мне не очень нравится ActivatedRoute из-за .get('state') , но это менее общий код.