Maison > interface Web > js tutoriel > Comment les composants angulaires interagissent-ils les uns avec les autres ? Introduction aux méthodes d'interaction courantes

Comment les composants angulaires interagissent-ils les uns avec les autres ? Introduction aux méthodes d'interaction courantes

青灯夜游
Libérer: 2021-06-24 11:39:38
avant
1988 Les gens l'ont consulté

L'interaction entre les composants se fait principalement entre les composants maître et esclave. Alors, comment les composants Angular interagissent-ils les uns avec les autres ? L'article suivant vous présentera les méthodes d'interaction courantes entre les composants angulaires.

Comment les composants angulaires interagissent-ils les uns avec les autres ? Introduction aux méthodes d'interaction courantes

[Recommandation de didacticiel connexe : "tutoriel angulaire"]

Grâce à la liaison d'entrée, transmettre les données. du composant parent au composant enfant

child.component.ts

export class ChildComponent implements OnInit {
  @Input() hero: any;
  @Input('master') masterName: string;      // 第二个 @Input 为子组件的属性名 masterName 指定一个别名 master

  constructor() { }

  ngOnInit(): void {
  }

}
Copier après la connexion

child.component.html

<div style="background-color: #749f84">
  <p>child works!</p>
  <h3>{{hero?.name}} says:</h3>
  <p>I, {{hero?.name}}, am at your service, {{masterName}}.</p>
</div>
Copier après la connexion

parent.component.ts

export class ParentComponent implements OnInit {
  hero = {name: &#39;qxj&#39;}
  master = &#39;Master&#39;

  constructor() {
  }

  ngOnInit(): void {
  }

}
Copier après la connexion

parent.component.html

<app-child [hero]="hero" [master]="master"></app-child>
Copier après la connexion

2. Le composant parent écoute les événements du composant enfant

child.component. .ts

export class ChildComponent implements OnInit {
  @Input()  name: string;
  @Output() voted = new EventEmitter<boolean>();
  didVote = false;

  vote(agreed: boolean) {
    this.voted.emit(agreed);
    this.didVote = true;
  }

  constructor() { }

  ngOnInit(): void {
  }

}
Copier après la connexion

child.component.html

<h4>{{name}}</h4>
<button (click)="vote(true)"  [disabled]="didVote">Agree</button>
<button (click)="vote(false)" [disabled]="didVote">Disagree</button>
Copier après la connexion

parent.component.ts

export class ParentComponent implements OnInit {
  agreed = 0
  disagreed = 0
  voters = [&#39;Narco&#39;, &#39;Celeritas&#39;, &#39;Bombasto&#39;]

  onVoted(agreed: boolean) {
    agreed ? this.agreed++ : this.disagreed++
  }

  constructor() {
  }

  ngOnInit(): void {
  }

}
Copier après la connexion

parent.component.html

<h2>Should mankind colonize the Universe?</h2>
<h3>Agree: {{agreed}}, Disagree: {{disagreed}}</h3>
<app-child *ngFor="let voter of voters" [name]="voter" (voted)="onVoted($event)"></app-child>
Copier après la connexion

Comment les composants angulaires interagissent-ils les uns avec les autres ? Introduction aux méthodes dinteraction courantes

3. Le composant parent et le composant enfant interagissent via une variable locale

Le composant parent ne peut pas utiliser la liaison de données pour lire les propriétés des composants enfants. ou des méthodes d'appel de sous-composants. Mais vous pouvez créer une nouvelle variable locale dans le modèle de composant parent pour représenter le composant enfant, puis utiliser cette variable pour lire les propriétés du composant enfant et appeler la méthode du composant enfant, comme indiqué dans l'exemple suivant.

Le sous-composant CountdownTimerComponent compte à rebours et lance un missile lorsqu'il atteint zéro. Les méthodes start et stop sont responsables du contrôle de l'horloge et de l'affichage des informations sur l'état du compte à rebours dans le modèle.

child.component.ts

export class ChildComponent implements OnInit, OnDestroy {
  intervalId = 0
  message = &#39;&#39;
  seconds = 11

  clearTimer() {
    clearInterval(this.intervalId)
  }

  ngOnInit() {
    this.start()
  }

  ngOnDestroy() {
    this.clearTimer()
  }

  start() {
    this.countDown()
  }

  stop() {
    this.clearTimer()
    this.message = `Holding at T-${this.seconds} seconds`
  }

  private countDown() {
    this.clearTimer()
    this.intervalId = window.setInterval(() => {
      this.seconds -= 1
      if (this.seconds === 0) {
        this.message = &#39;Blast off!&#39;
      } else {
        if (this.seconds < 0) {
          this.seconds = 10
        } // reset
        this.message = `T-${this.seconds} seconds and counting`
      }
    }, 1000)
  }

}
Copier après la connexion

child.component.html

<p>{{message}}</p>
Copier après la connexion

parent.component.ts

export class ParentComponent implements OnInit {
  constructor() {
  }
  ngOnInit(): void {
  }
}
Copier après la connexion

parent.component.html

<h3>Countdown to Liftoff (via local variable)</h3>
<button (click)="child.start()">Start</button>
<button (click)="child.stop()">Stop</button>
<div class="seconds">{{child.seconds}}</div>
<app-child #child></app-child>
Copier après la connexion

countdown timer

4. Le composant parent appelle <code><span style="font-size: 16px;">@ViewChild()</span>@ViewChild()

Cette méthode de variable locale

est une méthode simple et pratique. Mais cela présente également des limites, car les connexions composant parent-composant enfant doivent toutes être établies dans le modèle du composant parent. Le code du composant parent lui-même n'a pas accès aux composants enfants.

Si la classe du composant parent doit lire la valeur d'attribut du composant enfant ou appeler la méthode du composant enfant, elle ne peut pas utiliser la méthode variable locale

.

Lorsque le composant parent classe a besoin de cet accès, le composant enfant peut être utilisé comme ViewChild

et ***injecter*** dans le composant parent.

countdown-parent.component.ts

import {AfterViewInit, Component, ViewChild} from &#39;@angular/core&#39;
import {ChildComponent} from &#39;../child/child.component&#39;

@Component({
  selector: &#39;app-parent-vc&#39;,
  template: `
    <h3>Countdown to Liftoff (via ViewChild)</h3>
    <button (click)="start()">Start</button>
    <button (click)="stop()">Stop</button>
    <div class="seconds">{{ seconds() }}</div>
    <app-child></app-child>
  `,
})
export class CountdownParentComponent implements AfterViewInit {

  @ViewChild(ChildComponent)
  private timerComponent: ChildComponent

  seconds() {
    return 0
  }

  ngAfterViewInit() {
    // Redefine `seconds()` to get from the `ChildComponent.seconds` ...
    // but wait a tick first to avoid one-time devMode
    // unidirectional-data-flow-violation error
    setTimeout(() => {
      this.seconds = () => this.timerComponent.seconds
    }, 0)
  }

  start() {
    this.timerComponent.start()
  }

  stop() {
    this.timerComponent.stop()
  }
}
Copier après la connexion
Pour plus de connaissances liées à la programmation, veuillez visiter : Introduction à la programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal