在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错误消息。
答案 0 :(得分:0)
这被放弃了。 Cordova插件会在全球范围内破坏自身。对键入的控制较少,但是外部库可以访问它们,因此可以实现功能。