我正在将ionic 3应用程序移植到ionic4。有一个使用InjectionToken的服务:
export interface DiscoveryService {
scan(timeout: number): Observable<Peripheral>;
stopScan(): Promise<void>;
}
export const BLE_DISCOVERY = new InjectionToken<DiscoveryService>('ble.discovery');
@Injectable()
export class BleDiscovery implements DiscoveryService {
constructor(private decoder: BleDecoder, private ble: BLE, private platform: Platform) { }
scan(timeout: number): Observable<Peripheral> {
return from(this.platform.ready()).pipe(
mergeMap(_ => this.ble.scan([], timeout)),
map(device => this.decoder.decodeDevice(device)),
filter(isHickoryDevice),
map(setDefaultName)
);
}
stopScan(): Promise<void> {
return this.ble.stopScan();
}
}
然后我定义了以下内容,然后将BleModule导入到app.module.ts中
import { NgModule } from '@angular/core';
import { BLE } from '@ionic-native/ble/ngx';
import { BleDecoder } from './ble-decoder';
import { BleDiscovery, BLE_DISCOVERY } from './ble-discovery';
@NgModule({
providers: [
{ provide: BLE_DISCOVERY, useValue: {} },
BLE,
BleDecoder,
BleDiscovery
],
imports: [
],
exports: [
]
})
export class BleModule { }
在要使用该服务的页面中,我将其注入到构造函数中,如下所示:
constructor(
private zone: NgZone,
private router: Router,
@Inject(BLE_DISCOVERY) private discovery: DiscoveryService) {}
这时发现是一个空对象(即,我看不到scan和stopScan方法)。
这目前在我要移植的ionic 3应用程序中有效。不知道我错过了什么可能会导致这种情况?