首页 > 解决方案 > 在 Cordova DeviceReady 事件之后调用 Angular 模块导入

问题描述

在触发了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) {}
}

我的期望是应该在 deviceready 之后调用引导程序,并且这个引导程序应该TcpCommunicationModule.forRoot(window.Socket)从 AppModule 的导入部分调用。但是我的实际控制台输出显示 .forRoot() 在引导之前被调用,即:

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

我怎样才能让 .forRoot() 作为引导过程的一部分被调用(即,在设备准备好之后)?如果我将它移动到按钮单击或类似的调用,则为时已晚,并且我收到一条 staticInjector 错误消息,提示“tcpSocket”不存在。

标签: angularcordova

解决方案


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


推荐阅读