56 votes

Angular 2 - Comment déclencher une méthode sur un enfant à partir du parent

Il est possible d'envoyer des données du parent à l'enfant via @Input, ou d'appeler une méthode sur le parent à partir de l'enfant avec @Output, mais j'aimerais faire exactement l'inverse, c'est-à-dire appeler une méthode sur l'enfant à partir du parent. En gros, quelque chose comme ça :

@Component({
  selector: 'parent',
  directives: [Child],
  template: `
<child
  [fn]="parentFn"
></child>
`
})
class Parent {
  constructor() {
    this.parentFn()
  }
  parentFn() {
    console.log('Parent triggering')
  }
}

et l'enfant :

@Component({
  selector: 'child',
  template: `...`
})
class Child {
  @Input()
  fn() {
    console.log('triggered from the parent')
  }

  constructor() {}
}

L'arrière-plan est une sorte de requête "get", c'est-à-dire pour obtenir un statut actualisé de l'enfant.

Je sais que je pourrais y parvenir avec un service et un Subject/Observable, mais je me demandais s'il n'y avait pas quelque chose de plus simple ?

0 votes

60voto

awiseman Points 2926

Je pense que ça pourrait être ce que vous cherchez :

https://angular.io/guide/component-interaction#parent-interacts-with-child-via-local-variable

https://angular.io/guide/component-interaction#parent-calls-an-viewchild

Vous pouvez accéder aux propriétés et aux méthodes des enfants en utilisant des variables locales dans le modèle ou en utilisant l'attribut @ViewChild dans la classe du composant parent.

0 votes

Le décorateur ViewChild fonctionne-t-il également lorsque mon parent (table) a plusieurs enfants (rangées) comme composant ? Je n'ai qu'une seule instance de l'enfant, n'est-ce pas ?

4 votes

@Pascal Pour les cas où il existe plusieurs instances d'un composant enfant, vous devez utiliser le décorateur ViewChildren. angular.io/docs/ts/latest/api/core/index/

38voto

mpro Points 747

@ViewChild est la bonne solution, mais la documentation liée ci-dessus était un peu floue pour moi, donc je passe une explication un peu plus amicale qui m'a aidé à la comprendre.

Prenons un ChildComponent avec une méthode :

whoAmI() {
  return 'I am a child!!';
}

Et le composant parent, où nous pouvons appeler la méthode ci-dessus en utilisant la technique "@ViewChild" :

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

import { ChildComponent } from './child.component';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent implements OnInit {

  @ViewChild(ChildComponent) child: ChildComponent;

  ngOnInit() {
    console.log(this.child.whoAmI()); // I am a child!
  }
}

1 votes

Et s'il y a plus d'une instance de la même classe de composant ? D'après ce que j'ai essayé et vu, cela déclenche la première instance de la classe ?

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