Приложение My Angular 4 использует стороннюю библиотеку (mapbox) для рендеринга контента на странице. В этой библиотеке есть функция всплывающего диалогового окна, которая позволяет отображать всплывающие окна, когда пользователь щелкает булавку на карте: https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/
Всплывающее окно вызывается примерно со следующим кодом:
map.on('click', 'places', function (e) {
new mapboxgl.Popup()
.setLngLat(e.features[0].geometry.coordinates)
.setHTML('<div>this is a popup</div>')
.addTo(map);
});
Я хочу отобразить компонент Angular 4+ во всплывающем div. Вещи, которые я пробовал:
1) Привязка @ViewChild к div этого всплывающего окна.
// in the component that holds the map component
@ViewChild("pop", { read: ViewContainerRef }) childContainer: ViewContainerRef;
//when the user clicks the popup
popup.setHTML("<div #pop></div>")
childContainer
никогда не назначается. Я пробовал подождать секунды после открытия всплывающего окна или вызвать detectChanges()
на ChangeDetectorRef
моего компонента. Я пробовал открыть всплывающее окно в NgZone.runOutsideAngular()
, а затем запустить detectChanges()
вручную.
Если я вручную добавлю div в свой html-шаблон, всплывающее окно отобразится, как и ожидалось, в местоположении этого div.
2) Рендеринг с использованием фабрики в div с этим идентификатором
//when the user clicks the popup
popup.setHTML("<div id="pop">HERE</div>")
const element = this.elRef.nativeElement.querySelector("#pop"); //this is found
const factory = this.componentFactoryResolver.resolveComponentFactory(PopupComponent);
const component = factory.create(this.viewContainerRef.injector, null, element);
Содержимое div ЗДЕСЬ заменяется на <!---->
. Очевидно, что Angular отображает что-то в этом месте, но не сам компонент. Нужен ли мне другой инжектор?
3) Размещение элемента визуализации компонента непосредственно во всплывающем окне:
popup.setHTML("<popup-component></popup-component>")
Он никогда не превращается в реальный компонент. Даже с такими вещами, как detectChanges()
или NgZone
работает.
4) Есть другие идеи? Как визуализировать компонент Angular в произвольном месте HTML, определенном вне Angular?