【发布时间】:2019-06-06 23:48:21
【问题描述】:
在触发了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 之后调用 bootstrap,并且这个 bootstrap 过程应该从 AppModule 的导入部分调用 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() 作为引导过程的一部分被调用(即,在设备准备好之后)?如果我将它移动到按钮单击或类似的调用,则为时已晚,并且我收到一条 staticInjector 错误消息,提示“tcpSocket”不存在。
【问题讨论】: