gpt4 book ai didi

Angular 分量进入传单弹出窗口

转载 作者:太空狗 更新时间:2023-10-29 17:57:22 26 4
gpt4 key购买 nike

无法弄清楚如何将组件生成到传单弹出窗口中。我试过两件事:

首先,将组件选择器集成到 html 中,但看起来 angular 没有编译它:

    let my geojson = L.geoJSON(data, {
onEachFeature: (feature, layer) => {
let popup = L.popup().setContent('<app-component-detail></app-component-detail>');
layer.on({
click: () => {
layer.bindPopup(popup);
}
})
}
}).addTo(map);

当我点击 map 上的一个点时,弹出窗口是空的。

然后我考虑使用“resolveComponentFactory”将组件生成到 ViewContainerRef 中。如果我用 @ViewChild 调用我的 View 元素,它会很好地工作:

模板:

<div #myContainer></div>

逻辑:

@ViewChild('myContainer', { read: ViewContainerRef } ) myContainer: ViewContainerRef;
private generatedComponent= this.componentFactoryResolver.resolveComponentFactory(componentDetail);
let my geojson = L.geoJSON(data, {
onEachFeature: (feature, layer) => {
layer.on({
click: () => {
this.myContainer.createComponent(this.generatedComponent);
}
})
}
}).addTo(map);

现在我想将我的组件直接生成到弹出窗口中。我想我需要在弹出窗口的内容中设置一个 ViewContainerRef。类似的东西:

@ViewChild('popup', { read: ViewContainerRef } ) popup: ViewContainerRef;
private generatedComponent= this.componentFactoryResolver.resolveComponentFactory(componentDetail);
let my geojson = L.geoJSON(data, {
onEachFeature: (feature, layer) => {
let popup = L.popup().setContent('<div #popup></div>');
layer.on({
click: () => {
layer.bindPopup(popup);
this.popup.createComponent(this.generatedComponent);
}
})
}
}).addTo(map);

编辑:这是我如何转置这个 solution到 leaflet.js

    let geojson = L.geoJSON(data, {
style: () => defaultStyle,
onEachFeature: (feature, layer) => {
let popup = L.popup();
layer.on({
click: () => {
this.zone.run( () => {

if(this.componentRef){
this.componentRef.destroy();
}
const compFactory = this.componentFactoryResolver.resolveComponentFactory(componentDetailmponent);
this.componentRef = compFactory.create(this.injector);

if (this.appRef['attachView']) { // since 2.3.0
this.appRef['attachView'](this.componentRef.hostView);
this.componentRef .onDestroy(() => {
this.appRef['detachView'](this.componentRef.hostView);
});
} else {
this.appRef['registerChangeDetector'](this.componentRef.changeDetectorRef);
this.componentRef.onDestroy(() => {
this.appRef['unregisterChangeDetector'](this.componentRef.changeDetectorRef);
});
}

let div = document.createElement('div');
div.appendChild(this.componentRef.location.nativeElement);
popup.setContent(div);
}
)

}
});
layer.bindPopup(popup);
}
});

最佳答案

这是一个有效的解决方案:

创建组件

component = this.resolver.resolveComponentFactory(PopupComponent).create(this.injector);

将 NG 组件用作 HTML:

component.location.nativeElement

例如:

this.bindPopup(this.component.location.nativeElement);

地点:

  • 解析器:ComponentFactoryResolver -> 来自“@angular/core”;
  • 注入(inject)器:注入(inject)器 -> 来自“@angular/core”;

记得添加'app.module.ts':

entryComponents: [PopupComponent]

额外

  • 必须通知 Angular 关于“更改”,调用:

    component.changeDetectorRef.detectChanges()

  • 如果您想在弹出窗口中使用输入字段:

    DomEvent.disableClickPropagation(this.component.location.nativeElement);

:)

关于 Angular 分量进入传单弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42340067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com