调用子组件的方法

Per*_*eck 72 javascript angular

我有一个嵌套的子组件,如下所示:

<app-main>
    <child-component />
</app-main>
Run Code Online (Sandbox Code Playgroud)

我的appMain组件需要在子组件上调用方法.

如何在子组件上调用方法?

Gün*_*uer 87

您可以使用获取元素的引用

@ViewChild('childComponent') child;
Run Code Online (Sandbox Code Playgroud)

其中childComponent是模板变量<some-elem #childComponent>`或

@ViewChild(ComponentType) child;
Run Code Online (Sandbox Code Playgroud)

其中ComponentType是组件或指令的类型,然后在ngAfterViewInit事件处理程序中调用child.someFunc().

ngAfterViewInit() {
  console.log(this.child);
}
Run Code Online (Sandbox Code Playgroud)

另请参见获取模板中的元素


小智 52

父母和孩子可以通过数据绑定进行通信.

例:

@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);  
Run Code Online (Sandbox Code Playgroud)

演示

#f创建对子组件的引用,可以在模板中使用或传递给函数.来自父级的数据可以通过[ ]绑定传递.

  • @PerHornshøj-Schierbeck,如果元素上没有组件/指令,则本地模板变量(例如,`#f`)指的是元素本身.也许那是你的问题. (2认同)

Per*_*ges 21

作为儿子的组成部分

@Component({
    // configuration
    template: `{{data}}`,
    // more configuration
})
export class Son {

  data: number = 3;

  constructor() { }

  updateData(data:number) {
    this.data = data;
  }

}
Run Code Online (Sandbox Code Playgroud)

有一个父亲组成部分

@Component({
    // configuration
})
export class Parent {
  @ViewChild(Son) mySon: Son;

  incrementSonBy5() {
    this.mySon.updateData(this.mySon.data + 5);
  }
}
Run Code Online (Sandbox Code Playgroud)

在父亲的模板中

<son></son>
<button (click)="incrementSonBy5()">Increment son by 5</button>
Run Code Online (Sandbox Code Playgroud)

此解决方案仅适用<son></son>于父模板中的一个实例.如果您有多个实例,则只能在模板的第一个实例中使用.

  • 您可以使用`@ViewChildren()`来获取所有这些内容. (3认同)