Cordova DeviceReady事件后调用Angular模块导入

时间:2019-03-27 10:38:03

标签: angular cordova

在Cordova的deviceReady事件触发后,我需要使用cordova插件作为参数在外部库上调用.forRoot(plugin)。 (所以我知道插件已加载)

我的主要.ts文件包含以下内容:

let onDeviceReady = () => {
  console.log('deviceready');
  platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.error(err));
}

document.addEventListener('deviceready', onDeviceReady, false);

我的app.module.ts文件包含:

 imports: [
    BrowserModule,
    AppRoutingModule,
    TcpCommunicationModule.forRoot(window.Socket)
  ],
  providers: [TcpCommunicationService],

其中TcpCommunicationService是TcpCommunicationModule的服务,位于外部库(我们控制)中。

TcpCommunicationModule.ts包含以下内容:

@NgModule({
  declarations: [TcpCommunicationComponent],
  imports: [],
  exports: [TcpCommunicationComponent]
})
export class TcpCommunicationModule {
  public static forRoot(tcpSocket: any): ModuleWithProviders {
    console.log('forRoot called with object:');
    console.log(tcpSocket);
    return {
      ngModule: TcpCommunicationModule,
      providers: [
        TcpSocketFactoryService,
        {
          provide: 'tcpSocket',
          useValue: tcpSocket
        }
      ]
    };
  }
}

最后是TcpSocketFactoryService.ts包含:

export class TcpSocketFactoryService {
  constructor(@Inject('tcpSocket') private tcpSocket) {}
}

我的期望是应在设备就绪后调用引导程序,并且此引导程序过程应从AppModule的import部分中调用TcpCommunicationModule.forRoot(window.Socket)。但是我的实际控制台输出显示.forRoot()在引导程序之前被调用,即:

'forRoot called with object:'
undefined
'deviceready'
'Angular is running in the development mode. Call enableProdMode() to enable the production mode.'

如何在引导过程中(即在设备准备就绪后)调用.forRoot()?如果我将其移至单击按钮之类的按钮上,则为时已晚,并且收到“ tcpSocket”不存在的staticInjector错误消息。

1 个答案:

答案 0 :(得分:0)

这被放弃了。 Cordova插件会在全球范围内破坏自身。对键入的控制较少,但是外部库可以访问它们,因此可以实现功能。