使用forRoot将变量传递给模块

时间:2019-08-01 11:40:03

标签: javascript angular typescript redux

我已经开发了一个库,其中包含Angular中的共享组件,我想在那儿传递配置。

所有内容基本上都与以下内容相同: Pass config data using forRoot

问题是,我需要将用户传递到此模块,该模块在应用程序启动时获取并保存为Redux状态。

在导入模块时是否可以使用forRoot传递给用户可见性?也许可以通过延迟加载将某些内容传递给此模块“稍后”?

@select() private user$: Observable<User>

@NgModule({
  imports: [
    LibModule.forRoot({
      user: user$
    })
...
})

1 个答案:

答案 0 :(得分:0)

我采用了另一种方式-通过注入抽象服务的实现来获取设置。下面的代码:

库模块声明:

export interface LibSettings {
  user: User;
  url: string;
}

export abstract class AbstractLibSettingsService {
  abstract getSettings(): LibSettings;
}

@NgModule({
  declarations: [...],
  imports: [...],
  exports: [...]
})
export class LibModule {

  static forRoot(implementationProvider: Provider): ModuleWithProviders {
    return {
      ngModule: LibModule,
      providers: [
        implementationProvider
      ]
    }
  }
}

库服务,我需要用户:

constructor(private settingsService: AbstractGlassLibSettingsService) {
}

在使用lib的应用程序中,带有import的模块声明:

export const LIB_SETTINGS_PROVIDER: ClassProvider = {
    provide: AbstractLibSettingsService,
    useClass: LibSettingsService
};

@NgModule({
    imports: [...
        LibModule.forRoot(LIB_SETTINGS_PROVIDER)
    ],
...
})

最后,在应用程序中实现服务:

@Injectable()
export class LibSettingsService extends AbstractLibSettingsService {

    @select() private user$: Observable<User>;
    private user: User;

    constructor() {
        super();
        this.user$.subscribe(user => this.user = user);
    }

    public getSettings(): GlassLibSettings {
         ...
    }