tutorial examples ejemplos javascript angular

javascript - examples - Llamar a un método del componente hijo



angularjs tutorial (4)

Tengo un componente hijo anidado como este:

<app-main> <child-component /> </app-main>

Mi componente appMain necesita invocar un método en el componente secundario.

¿Cómo invocar un método en el componente hijo?


El padre y el niño pueden comunicarse a través del enlace de datos.

Ejemplo:

@Component({ selector: ''child-component'', inputs: [''bar''], template: `"{{ bar }}" in child, counter {{ n }}` }) class ChildComponent{ constructor () { this.n = 0; } inc () { this.n++; } } @Component({ selector: ''my-app'', template: ` <child-component #f [bar]="bar"></child-component><br> <button (click)="f.inc()">call child func</button> <button (click)="bar = ''different''">change parent var</button> `, directives: [ChildComponent] }) class AppComponent { constructor () { this.bar = ''parent var''; } } bootstrap(AppComponent);

Demo

#f crea una referencia al componente hijo y se puede usar en una plantilla o pasar a la función. Los datos del padre se pueden pasar mediante el enlace [ ] .


La mejor manera de acceder a un componente hijo es @ViewChild .

Digamos que tiene AppMainComponent con un ChildComponent anidado de su ejemplo.

// app-main.component.ts import { Component } from ''@angular/core''; @Component({ selector: ''app-main'', template: ` <child-component /> ` }) export class AppMainComponent {}

Desea invocar un método claro de su ChildComponent.

// child.component.ts import { Component } from ''@angular/core''; @Component({ selector: ''child-component'', template: ''{{ greeting }}'' }) class ChildComponent { greeting: String = ''Hello World!''; clear() { this.greeting = null; } }

Puede lograrlo importando la clase ChildComponent, el decorador ViewChild y pasar la clase del componente como una consulta. De esta manera, tendría acceso a la interfaz de ChildComponent almacenada en la variable personalizada. Aquí hay un ejemplo:

// app-main.component.ts import { Component, ViewChild } from ''@angular/core''; import { ChildComponent } from ''./components/child/child.component''; @Component({ selector: ''app-main'', template: ` <child-component /> ` }) class ChildComponent { @ViewChild(ChildComponent) child: ChildComponent; clearChild() { this.child.clear(); } }

¡Aviso! La vista ngAfterViewInit solo está disponible después de ngAfterViewInit .

Responda después de que Angular inicialice las vistas del componente y las vistas secundarias. Llamado una vez después del primer ngAfterContentChecked (). Un gancho solo para componentes.

Si desea ejecutar el método automáticamente, debe hacerlo dentro de este enlace de ciclo de vida.

También puede obtener una QueryList de QueryList de componentes secundarios a través del decorador ViewChildren .

import { Component, ViewChildren, QueryList } from ''@angular/core''; import { ChildComponent } from ''./components/child/child.component''; ... @ViewChildren(ChildComponent) children: QueryList<ChildComponent>;

QueryList puede ser muy útil, por ejemplo, puede suscribirse para cambios secundarios.

También es posible crear variables de referencia de plantilla y obtener acceso a ellas a través del decorador ViewChild.


Puede obtener una referencia a un elemento utilizando

@ViewChild(''childComponent'') child;

donde childComponent es una variable de plantilla <some-elem #childComponent > `o

@ViewChild(ComponentType) child;

donde ComponentType es el tipo de componente o directiva y luego en ngAfterViewInit o un controlador de eventos llama a child.someFunc() .

ngAfterViewInit() { console.log(this.child); }

Consulte también obtener un elemento en la plantilla


Siendo un componente hijo

@Component({ // configuration template: `{{data}}`, // more configuration }) export class Son { data: number = 3; constructor() { } updateData(data:number) { this.data = data; } }

Tener un componente padre

@Component({ // configuration }) export class Parent { @ViewChild(Son) mySon: Son; incrementSonBy5() { this.mySon.updateData(this.mySon.data + 5); } }

En la plantilla del padre

<son></son> <button (click)="incrementSonBy5()">Increment son by 5</button>

Esta solución solo funciona para una instancia de <son></son> en la plantilla principal. Si tiene más de una instancia, solo funcionará en la primera de la plantilla.