Я заметил, что ваш родительский шаблон является модальным, и вы открываете его с помощью переменной шаблона здесь: ((click)="open(content)"
через ваш модальный сервис. Это означает, что он динамически добавляется в DOM.
Так что это может быть проблема синхронизации, потому что родитель загружается динамически.
Я бы попробовал это, в ngAfterViewInit CHILD, запустить событие, используя 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 всегда будет неопределенным.
person
rmcsharry
schedule
15.05.2018