angular - 通过 ng-content 从子组件访问组件提供者
问题描述
我正在使用库ngx-mapbox-gl。该库提供了一个组件“mgl-map”,它允许您添加子层组件,然后在地图上呈现。
我的目标是拥有一个包含地图组件的父组件,并让图层使用 ng-content 注入。
Inside custom map component map.component.ts:
<mgl-map ...>
<!-- layers will be injected here -->
<ng-content></ng-content>
</mgl-map>
Intended use of app-map component:
<app-map>
<some-layer ...></some-layer>
</app-map>
这会引发以下错误:
ERROR Error: StaticInjectorError(AppModule)[LayerComponent -> MapService]:
我认为问题源于在提供 MapService的库的地图组件中使用组件提供程序。
其他用户已经注意到了这个问题,但是项目维护者还没有提供一个可以在哪里工作的例子:https ://github.com/Wykks/ngx-mapbox-gl/issues/51 。建议的解决方法是使用动态内容注入。
我试图解决这个问题
正如维护者建议的那样,我尝试在父组件中使用 ng-template 和带有 ngTemplateOutlet 的 ng-container 用于动态内容注入,但这不起作用,产生相同的错误。例子:
app.component.html:
<app-map [layers]="layers">
<ng-template #layers>...</ng-template>
</app-map>
map.component.ts:
@Input() layers: TemplateRef<any>;
map.component.html:
<mgl-map ...>
<ng-container *ngTemplateOutlet="layers"></ng-container>
</mgl-map>
子组件仍然可以通过注入主机来访问父 mgl-map 组件,所以我不确定为什么不能也引用提供程序。
如何强制子组件从正确的父组件使用 MapService,或者这是不可能的?
谢谢
解决方案
他们是您可以提供服务的两个地方-
- 在应用模块中
- 在地图组件提供者数组中
在地图组件中提供服务,例如 -
import mapService from 'mypath';
@Component({
....,
providers:[mapService]
})
推荐阅读
- node.js - PayloadTooLargeError:使用 Angular 7 和 nodejs express 上传图像时请求实体太大
- c# - 如何从 Unity 中指定路径获取的文件列表中删除文件?
- windows - windows上的docker里面的docker
- c# - 如何动态调用具有泛型类型参数的方法
- angular - MEAN Stack - MongoDB - 在具有两种不同条件的文档中循环
- dart - Flutter 如何更新变量并在不同的有状态小部件中使用它们?
- javascript - 具有唯一选择的多选下拉列表 - React JS
- javascript - 使用授权标头从 Geoserver 获取 JSON 文件会导致 MIME 类型错误
- python - 使用Python滚动页面时如何在列表标签内获取多个div元素文本
- r - 使用“fread”,如何从 csv 中消除注释行?