Я полагаю, что ваша проблема связана с содержимым, к которому вы пытаетесь прикрепить OLMap, к включенному содержимому mat-stepper или mat-step.
В жизненном цикле компонента дочерний компонентне готов на шаге OnInit родителя.Поскольку вы помещаете нужный div в компонент mat, он вместо этого включается в жизненный цикл этого компонента.
Один из способов решить эту проблему - работать с методом жизненного цикла ngAfterViewInit.Наличие вашего кода в этом методе должно решить эту проблему.
ngAfterViewInit() {
this.map = new OlMap({
target: 'map',
layers: [this.layer],
view: this.view,
});
}
Я бы хотел представить другой способ работы с компонентами, а также ради потенциального любопытства.Следя за включенным контентом, если нужный элемент находится в текущем компоненте, вы должны использовать декоратор ViewChild, чтобы выбрать его.В противном случае, если он находится в дочернем компоненте, используйте декоратор ContentChild.
// html
<mat-horizontal-stepper ...>
<mat-step ...>
<form ...>
...
<div #myMapRef id="map"></div>
...
</form>
</mat-step>
...
</mat-horizontal-stepper>
// parent ts
@ContentChild('myMapRef') // <-- if it's in a child component, your case should use this
@ViewChild('myMapRef') // <-- if it's in this component, your "this is working" would use this
myMap: ElementRef;
ngAfterViewInit() {
console.log(this.myMap); // can get the ID from the ElementRef
}
Я настоятельно рекомендую ознакомиться с глубиной жизненного цикла компонента.Это одна вещь, которую я хотел бы сделать раньше, изучая Angular.