Я заметил, что ваш родительский шаблон является модальным, который вы открываете с помощью переменной шаблона здесь: ((click)="open(content)"
через ваш модальный сервис.Таким образом, это означает, что он добавляется в DOM динамически.
Так что это может быть проблемой синхронизации, поскольку родительский файл загружается динамически.событие с использованием EventEmitter.Захватите событие в родительском объекте, а затем установите флаг в trueТогда в ТЕОРИИ вы можете сделать это в родительском:
savePNG() {
if (this.childLoaded) this.traceRef.savePNG();
}
Вы точно знаете, что дочерний элемент загружен и, следовательно, доступно savePNG.Тем не менее, смотрите мое примечание - traceRef по-прежнему будет неопределенным.
Поэтому вам нужно передать ссылку на дочернюю функцию в EventEmitter и использовать ее вместо # traceRef.
Например - вребенок:
export class app-com2 implements blah blah {
@Output() childLoaded: EventEmitter<any> = new EventEmitter<any>();
savePNG() {
// code to save the image
}
ngAfterViewInit() {
this.childLoaded.emit(this.savePNG);
}
}
родитель:
.. com1.html
<ng-template #content let-c="close" let-d="dismiss">
<div class="modal-header">
<h4 class="modal-title">Title</h4>
</div>
<div class="modal-body" style="display: flex; justify-content: center;">
<app-com2 [var1]="value" (childLoaded)="handleChildLoaded($event)"></app-com2>
</div>
.. com1.ts
handleChildLoaded(save: any) {
const result = save;
console.log(result);
}
Документы от дочерних до родительских.
ПРИМЕЧАНИЕ
Думайте об этом подробнее - это проблема жизненного цикла / времени, поэтому ваш код никогда не будет работать.Это может быть причиной:
Ваш родительский компонент загружает, запускает все хуки жизненного цикла (например, ngOnInit и ngAfterViewInit и т. Д.).#content обрабатывается и становится доступным в ngAfterViewInit и последующих хуках.
Теперь вы нажимаете кнопку, чтобы загрузить #content (который доступен).Но он имеет компонент <app-com2>
, на который ссылается переменная шаблона #traceRef.Но переменные шаблона обрабатываются только непосредственно перед срабатыванием ловушки ngAfterViewInit - и это уже сработало для родителя, и поэтому #traceRef приходит слишком поздно, чтобы Angular подключил его.Следовательно, он всегда будет неопределенным.
См. Комментарии ниже относительно (2) - не совсем верно, но я подозреваю, что из-за того, как вы загружаете модал, #traceRef всегда будетбыть неопределенным.