如何在非页面独立脚本中实例化@ionic/angular的Platform对象
直接手动实例化Platform的方式理论上可以实现,但存在较高的运行兼容风险,更推荐你将已经由Angular依赖注入初始化完成的Platform实例作为参数传入Test类。
为什么不推荐手动实例化
Ionic的Platform是和Angular运行时深度绑定的服务,手动构造需要的两个参数很难保证和项目运行上下文匹配:
doc参数对应Angular注入的DOCUMENT令牌值,虽然浏览器环境下可以直接传全局document变量,但在服务端渲染、微前端等特殊场景下会直接报错NgZone是Angular全局维护的变更检测上下文实例,如果你自己手动创建新的NgZone实例传入,Platform的所有生命周期事件回调都会脱离Angular的变更检测周期,导致监听到事件后页面不会自动更新。
你之前可以手动实例化BluetoothLE插件成功,是因为这类原生插件的封装类没有和Angular运行时绑定,二者设计逻辑完全不同。
推荐实现方案
直接将DI生成的Platform实例传入你的独立类即可:
// 独立脚本test.ts import { Platform } from '@ionic/angular'; export class Test { constructor(private platform: Platform) { // 直接使用传入的platform实例即可,所有功能都和DI注入的实例完全一致 } } // 调用侧(可通过Angular DI拿到Platform的页面/服务中) import { Test } from './test'; @Component({...}) export class MyPage { constructor(private platform: Platform) { const testInstance = new Test(this.platform); } }
特殊场景下手动实例化方案(不推荐,仅做参考)
如果你的运行场景确实无法从外部传入实例,可以按以下方式实现,仅保证浏览器环境可用:
import { Platform } from '@ionic/angular'; import { NgZone, inject } from '@angular/core'; class Test { constructor(){ // 仅在Angular注入上下文内可使用inject方法获取NgZone实例 const plat = new Platform(document, inject(NgZone)); } }
内容的提问来源于stack exchange,提问作者Bishop19
相关产品推荐
相关产品推荐

