Javascript Injector中提供的Angular 6通用服务需要另一个app注入变量
我用的是角度通用。我已经创建了一个Javascript Injector中提供的Angular 6通用服务需要另一个app注入变量,javascript,angular,dependency-injection,angular-universal,Javascript,Angular,Dependency Injection,Angular Universal,我用的是角度通用。我已经创建了一个PlatformService来检测我当前正在使用的平台 /* platform.service.js */ import { Injectable, Inject, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser, isPlatformServer } from '@angular/common'; @Injectable({ providedIn: 'root' })
PlatformService
来检测我当前正在使用的平台
/* platform.service.js */
import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
@Injectable({
providedIn: 'root'
})
export class PlatformService {
constructor(
@Inject(PLATFORM_ID) private platformId: Object
) {
this.platformId; // this is coming out undefined
}
isBrowser() {
return isPlatformBrowser(this.platformId);
}
isServer() {
return isPlatformServer(this.platformId);
}
}
我正在创建一个BaseComponent
,用于常规处理我的路由绑定组件
/* base.component.ts */
import { Component, OnInit, Inject } from '@angular/core';
import { InjectorHolderService } from '@core/services/util/injector-holder.service';
import { PlatformService } from '@core/services/util/platform.service';
@Component({
selector: 'app-base',
template: '',
})
export class BaseComponent implements OnInit {
protected platformService: PlatformService;
constructor() {
this.platformService = InjectorHolderService.injector.get(PlatformService);
console.log(this.platformService);
}
}
由于这个组件将被许多组件继承,我不想通过super()
传递PlatformService
。所以我决定继续创建一个注入器
/* app.module.ts */
import { InjectorHolderService } from '@core/services/util/injector-holder.service';
import { PlatformService } from '@core/services/util/platform.service';
@NgModule({ ... })
export class AppModule {
constructor() {
InjectorHolderService.injector = Injector.create({
providers: [
{
provide: PlatformService,
useClass: PlatformService,
deps: [], // I think i need to put something here, but not sure.
}
]
});
}
}
以及一个可以容纳所有注入模块供将来使用的服务
/* injector-holder.service.ts */
import { Injectable, Injector } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class InjectorHolderService {
static injector: Injector;
}
但是@Inject(platformId)私有platformId:Object
正在发出未定义的,因此我无法检测平台
我错过了什么?或者如果有更好的方法来实现上述功能
如果你们需要查看任何其他文件,请告诉我。我不确定以下方法是好是坏,目前,这是唯一适合我的方法。希望听到任何新的解决方法。
由于PlatformService
需要@Inject(PLATFORM\u ID)
(仅从AppModule
提供),因此我创建的新Injector
无法找到@Inject(PLATFORM\u ID)
的任何值,因此未定义
因此,我现在使用的不是PlatformService
中的类PlatformService
,而是PlatformService
的实例化对象,因此能够很好地访问BaseComponent
中的所有内容
修改了myAppModule
,如下所示:
/* app.module.ts */
import { InjectorHolderService } from '@core/services/util/injector-holder.service';
import { PlatformService } from '@core/services/util/platform.service';
@NgModule({ ... })
export class AppModule {
constructor(
private platformService: PlatformService,
) {
InjectorHolderService.injector = Injector.create({
providers: [
{
provide: PlatformService,
useValue: this.platformService, // notice the change of key, using value not class
deps: [],
}
]
});
}
}
将尝试添加最小回购,以重新创建此问题并与大家共享,如果有人想了解更多信息。发现此链接很有用,但此方法仅适用于客户端,因为在main.ts
文件中进行了初始化。