Я нашел решение, переместив инициализацию Raphael в метод ngOnInit (), а затем переместив мой вызов @ViewChild () в родительском компоненте в метод ngAfterViewInit (). Таким образом, дочерний компонент будет иметь достаточно времени для полной инициализации, и его объект Raphael будет сгенерирован до того, как родительский объект начнет вызывать методы рисования в дочернем компоненте, для которых требуется Raphael.
Дочерний компонент:
@Component({
selector: 'app-g-view',
template:
`<div
id="conP"
class="container-fluid"
style="width:600px;height:600px;"
>
</div>`,
styleUrls: ['./gview.component.css']
})
export class GVComponent implements OnInit, AfterViewInit{
private paper: Raphael;
constructor() {}
ngOnInit() {
this.paper = Raphael("conP", "100%", "100%");
console.log(this.paper);
let border = this.paper.rect(0,0,"100%","100%");
border.attr({fill:"white"});
console.log(border);
}
Родительский компонент:
@Component({
selector: 'app-par',
templateUrl: './par.component.html',
styleUrls: ['./par.component.css'],
})
export class ParComponent implements OnInit, AfterViewInit {
@ViewChild(GVComponent) _gv: GVComponent;
constructor(){}
ngAfterViewInit(){
console.log(`testing child component after init: ${this._gv}`);
this._gv.testMethod();
}