问题描述
在基于价值的提供者(代币)中,我们有这样的东西(在模块中):
const CONFIG = 'CONFIG';
providers: [
{
provide: CONFIG,useValue: myConfigObj,},
因为我们在模块中定义了提供者,所以在服务中我们可以这样做:
constructor(@Optional() @Inject(CONFIG) config) {
console.log(config);
}
但是当我们想像这样访问 PLATFORM_ID
时:
constructor(@Inject(PLATFORM_ID) private platformId) {
我们没有在模块的提供者中定义 PLATFORM_ID
。这是在哪个模块中定义的?什么是 useValue
?
解决方法
已经在 Angular Community Discord 服务器上为您回答了这个问题,但我不确定您是否看到了。
通过在 main.ts 中调用 platformBrowserDynamic()
(或 platformDynamicServer()
,如果是@Angular/universal 应用),会创建一个由 PlatformModule
配置的注入器。 PLATFORM_ID
在这里提供。
该值是一个字符串:'browser'
(或 'server'
用于通用应用)。
您可以在此处阅读有关平台注入器(它是根注入器的父级)的更多信息:https://angular.io/guide/hierarchical-dependency-injection#platform-injector
编辑:根据请求,源代码的链接:在此处提供:https://github.com/angular/angular/blob/11.2.9/packages/platform-browser-dynamic/src/platform_providers.ts#L27,然后将其传递到 createPlatformFactory:https://github.com/angular/angular/blob/11.2.9/packages/platform-browser-dynamic/src/platform-browser-dynamic.ts#L29 中,其中使用传入的提供程序创建注入器:{ {3}}