45 votes

Angular 2+ appelle une fonction dans un composant enfant depuis son composant parent

J'aimerais savoir quelle est la meilleure façon de procéder et s'il existe différentes méthodes. J'essaie d'appeler une fonction dans un composant enfant à partir de son composant parent. Donc si j'ai :

<parent>
    <child></child>
</parent>

...et child a des fonctions appelées show() o hide() Comment puis-je appeler l'un ou l'autre à partir de parent ?

95voto

mxii Points 10713

À l'intérieur de votre modèle, en utilisant des variables/références de modèle :

<parent (click)="yourChild.hide()">
    <child #yourChild></child>
</parent>

live-demo : https://stackblitz.com/edit/angular-so-3?file=src%2Fapp%2Fapp.component.html

OU

A l'intérieur de votre composant :

import { ..., ViewChild, ... } from '@angular/core';

// ...

export class ParentComponent {
   @ViewChild('yourChild' /* #name or Type*/, {static: false}) child;

   ngAfterViewInit() {
      console.log('only after THIS EVENT "child" is usable!!');
      this.child.hide();
   }
}

A l'intérieur de votre composant (option 2) :

import { ..., ViewChild, ... } from '@angular/core';
import { ..., ChildComponent, ... } from '....';

// ...

export class ParentComponent {
   @ViewChild(ChildComponent /* #name or Type*/, {static: false}) child;

   ngAfterViewInit() {
      console.log('only after THIS EVENT "child" is usable!!');
      this.child.hide();
   }
}

Voir les documents officiels : https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-view-child

2 votes

Excellent. Donc quand on passe un nom de classe à @ViewChild, on récupère automatiquement tout ChildComponent instancié par le modèle ?

2 votes

Exactement, je ne sais pas s'il s'agit du premier ou du dernier enfant s'il y en a plusieurs. Mais vous pouvez utiliser ViewChildren pour plusieurs enfants ! Même chose pour le nom ou la classe.

4 votes

Ajout d'un plunker de démonstration. S'il y a plusieurs enfants de la même classe, ViewChild Je prendrai le premier trouvé ! ;)

4voto

Blauhirn Points 15

Pour appeler une fonction d'un enfant, vous aurez besoin de @ViewChild . Cependant, pour afficher/masquer un composant, il est préférable de résoudre ce problème dans le modèle :

<parent>
    <button (click)="showChild=!showChild">Toggle child</button>
    <child *ngIf="showChild"></child>
</parent>

Pas besoin de déclarer une fonction personnalisée hide() .

1 votes

Il est préférable d'utiliser une fonction personnalisée car les tests sont alors plus faciles.

4voto

Bludream Points 300

Les autres réponses sont correctes, mais je pense que parfois cette fonction est censée être appelée avec le flux de données de la manière angulaire du parent à l'enfant, donc ce dont vous avez besoin est d'exécuter une fonction chaque fois qu'une variable a changé dans le composant parent. voir ci-dessous :

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  name = "Angular";
  variable = "yes!";
  toggle() {
    this.variable = this.variable === "yes!" ? "hell no!" : "yes!";
  }
}

app tempalte :

<button (click)="toggle()">Toggle</button>

Parent says: {{variable}}    

<p>
 <app-child [childVar]="variable"></app-child>
</p>

composant de l'enfant :

export class ChildComponent implements OnInit {
  _childVar: string; // if you need to record the value and access later in child component
  counter = 0;

  @Input()
  set childVar(value: string) {
    this._childVar = value;
    this.childFunction(); // the answer is here
  }

  childFunction() {
    this.counter++;
    console.log("called child function");
  }

}

tester ici https://stackblitz.com/edit/angular-1rywfc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X