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
中的所有内容

修改了my
AppModule
,如下所示:

/* 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
文件中进行了初始化。