ng-template используется Angular для создания шаблонов — это означает, что он не отображается в DOM, если только определенные условия не указывают Angular использовать его в фактическом DOM.
Поэтому, когда у вас есть настройка интерфейса компонента внутри ng-template, она недоступна/известна вашему приложению, если только:
- было применено условие ng-template и
- ваш хост (родительский) компонент имеет ссылку на него:
Например, как в вашем примере:
<button type="button" (click)="hello.sayHello()">Method Inside Hello</button>
<ng-template>
<hello #hello></hello>
<ng-template>
Вышеупомянутое само по себе не будет работать, так как не выполняются 2 упомянутых выше условия. Чтобы исправить это, вам нужно использовать ViewChild, чтобы получить ссылку на компонент приветствия. Вот так:
import { Component, ViewChild } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
@ViewChild('hello') hello;
}
Затем вам нужно убедиться, что используется ng-template (независимо от того, что вызывает размещение ng-template в DOM для вашего приложения):
<ng-template [ngIf]="true">
<hello #hello></hello>
<ng-template>
Теперь ссылка на метод внутри дочернего компонента будет работать:
https://stackblitz.com/edit/angular-ivy-hnmw17?file=src/app/app.component.html
Вы можете узнать больше о том, как структурные директивы Angular под капотом используют ng-template: https://angular.io/guide/structural-directives
person
Sergey Rudenko
schedule
11.08.2020