272 votes

Comment appeler la fonction d'un autre composant en Angular2

Je possède deux composants comme suit et je veux appeler une fonction depuis un autre composant. Les deux composants sont inclus dans le troisième composant parent en utilisant une directive.

Composant 1 :

@component(
    selector:'com1'
)
export class com1{
    function1(){...}
}

Composant 2 :

@component(
    selector:'com2'
)
export class com2{
    function2(){...
        // je veux appeler la fonction 1 de com1 ici
    }
}

J'ai essayé d'utiliser @input et @output mais je ne comprends pas exactement comment les utiliser et comment appeler cette fonction, quelqu'un peut-il m'aider ?

0 votes

163voto

Günter Zöchbauer Points 21340

Si com1 et com2 sont des frères et sœurs, vous pouvez utiliser

@component({
  selector:'com1',
})
export class com1{
  function1(){...}
}

com2 émet un événement en utilisant un EventEmitter

@component({
  selector:'com2',
  template: `click`
)
export class com2{
  @Output() myEvent = new EventEmitter();
  function2(){...
    this.myEvent.emit(null)
  }
}

Ici, le composant parent ajoute une liaison d'événement pour écouter les événements myEvent et appelle ensuite com1.function1() lorsque cet événement se produit. #com1 est une variable de modèle qui permet de faire référence à cet élément depuis un autre endroit dans le modèle. Nous utilisons cela pour faire de function1() le gestionnaire d'événements pour myEvent de com2:

@component({
  selector:'parent',
  template: ``
)
export class com2{
}

Pour d'autres options de communication entre les composants, voir aussi component-interaction

0 votes

Votre question ne contient rien sur la relation parent-enfant. Que cherchez-vous à accomplir?

0 votes

Lorsque vous avez commencé à dire "Ici, le composant parent ajoute une liaison d'événement pour écouter monÉvénement", je suis très confus. Je pensais que nous essayions de résoudre la situation du composant frère. Le lien angulaire est tout parent enfant, donc je ne peux pas les utiliser.

0 votes

C'est le parent des frères et sœurs (vous pouvez également dire hôte). est une liaison d'événement pour le parent/hôte, car c'est la seule façon fournie par Angular. Cependant, le gestionnaire d'événements appelle une méthode sur l'autre frère et sœur (com1). Le parent est utilisé comme médiateur.

127voto

Jayantha Points 463

Vous pouvez accéder à la méthode du composant un à partir du composant deux..

componentOne

  ngOnInit() {}

  public testCall(){
    alert("Je suis ici..");    
  }

componentTwo

import { oneComponent } from '../one.component';

@Component({
  providers:[oneComponent ],
  selector: 'app-two',
  templateUrl: ...
}

constructor(private comp: oneComponent ) { }

public callMe(): void {
    this.comp.testCall();
  }

Fichier html du composant deux

cliquer

2 votes

C'était ça pour moi jusqu'à ce que j'aie besoin, par exemple, d'accéder à une variable dans componentOne depuis componentTwo en invoquant testCall.... le cas où la valeur de la variable est définie par componentOne mais componentTwo obtiendra la valeur par défaut et non la valeur actuelle.

2 votes

Je n'obtiens pas les valeurs de la variable componentOne à l'intérieur de la méthode testCall si j'appelle testCall depuis componentTwo. Une idée?

0 votes

Veuillez expliquer cette méthode pour Ionic 4 avec Angular 7

49voto

Ihor Khomiak Points 493

Composant 1 (enfant):

@Component(
  selector:'com1'
)
export class Component1{
  function1(){...}
}

Composant 2 (parent):

@Component(
  selector:'com2',
  template: ``
)
export class Component2{
  @ViewChild("component1") component1: Component1;

  function2(){
    this.component1.function1();
  }
}

0 votes

Bonne réponse, voir aussi ici.

3 votes

D'accord comment je peux appeler la fonction2 sur HTML? j'ai toujours cette erreur this.component1 is undefined

0 votes

<com1 #composant1 (click)="function2()"></com1>

29voto

thierry templier Points 998

Il dépend de la relation entre vos composants (parent / enfant) mais la meilleure / générique façon de faire communiquer les composants est d'utiliser un service partagé.

Voir ce document pour plus de détails :

Cela étant dit, vous pourriez utiliser ce qui suit pour fournir une instance du com1 dans com2 :

  ...
  ...

Dans com2, vous pouvez utiliser le suivant :

@Component({
  selector:'com2'
})
export class com2{
  @Input()
  com1ref:com1;

  function2(){
    // je veux appeler la fonction 1 de com1 ici
    this.com1ref.function1();
  }
}

0 votes

Je reçois une erreur Can't bind to 'com1Ref' since it isn't a known native property

0 votes

Et elle ne prend pas this.com1.function1(); mais plutôt this.com1ref.function1();

0 votes

Merci d'avoir signalé la faute de frappe! Avez-vous le @Input sur le champ?

1voto

RAHUL KUMAR Points 321
  • Le premier composant est DbstatsMainComponent
  • Le deuxième composant DbstatsGraphComponent.
  • Le premier composant appelle la méthode du deuxième

Graph

Remarquez la variable locale #dbgraph sur le composant enfant, que le parent peut utiliser pour accéder à ses méthodes (dbgraph.displayTableGraph()).

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