Как говорят другие, вы можете использовать @ViewChild. Но обратите внимание, что таким образом вы вызовете функцию для первого потомка этого типа .
Если у вас есть дочерний компонент, подобный этому:
@Component({
selector: 'app-my-child',
template: '<p>I am the child number {{id}} </p>'
})
export class MyChildComponent {
@Input() id: number;
constructor() { }
print() {
console.log('Action from id ' + this.id);
}
}
и родительский компонент, подобный этому:
<button (click)="printChild()">Print!</button>
<app-my-child [id]="1"></app-my-child>
<app-my-child [id]="2"></app-my-child>
ссылка
@Component({
selector: 'app-internal',
templateUrl: './internal.component.html'
})
export class InternalComponent {
@ViewChild(MyChildComponent) child: MyChildComponent;
constructor() { }
printChild() {
this.child.print();
}
}
вы всегда будете вызывать функцию печати первого найденного элемента. Поэтому, если вы поменяете местами два компонента MyChildComponents, у вас будет напечатано «Действие с идентификатором 2».
Чтобы избежать этого, вы можете явно определить целевой компонент следующим образом:
<button (click)="id2.print()">Print!</button>
<app-my-child #id1 [id]="1"></app-my-child>
<app-my-child #id2 [id]="2"></app-my-child>
если вы не хотите ссылаться на них в классе компонентов или используете противоположный подход:
@ViewChild('id1') child1 : MyChildComponentComponent;
printChild() {
this.child1.print();
}