我有一个关于platform.ready().then(() => {})
方法的基本问题。当我们使用原生插件时,我们是否需要每次都使用此方法?喜欢Status bar
或LocalStorage
等?
如果我们仅在app.component.ts
文件中使用上述方法,因此它是根组件,这还不够吗?在此根组件之后,希望platform
为所有其他后续组件做好准备,不是吗?那么为什么我们也需要ready
子组件使用该方法呢?因为我看过很多文章和视频,如果有任何本机插件,它就会使用。希望这不需要不是吗?
在这个官方文档中,您可以看到它在子组件内部使用不是吗?你的想法?platform.ready((.then((( => {}(
platform.ready()
是一个承诺,一旦您的设备/本机插件准备就绪,它就会解决。
让我们看一下ionic sidemenu starter
模板 https://github.com/ionic-team/ionic2-starter-sidemenu/blob/master/src/app/app.component.ts。
正如您在第 15 行的app.component.ts
中看到的那样,rootPage 已设置并会尽快加载。在构造函数中this.initializeApp();
调用
this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.statusBar.styleDefault();
this.splashScreen.hide();
});
与javascript中的每个承诺一样,你无法知道它何时解决。正如您在代码中看到的,ionic 应用程序不会"等待"平台准备就绪。只有statusBar.styleDefault()
和splashScreen.hide()
电话等待这个承诺。
假设解决承诺需要很长时间,例如 5 秒。
如果您的HomePage
中有任何离子原生代码,您在app.component.ts
或任何其他页面中使用的任何提供程序(因为用户在此期间已经可以在应用程序中导航(,离子原生调用将失败,因为平台尚未准备就绪。
举个例子:
constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen, private: qrScanner: QrScanner) {
this.initializeApp();
this.qrScanner.scan(); // Let's assume this is a provider we made to start a QR scanner. It will try to load the scanner immediately, regardless of the state of the platform.ready() promise. So if the platform is not ready, it will crash.
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: HomePage },
{ title: 'List', component: ListPage }
];
}
这意味着从理论上讲,在使用本机插件时,您应该始终使用this.platform.ready()
以确保平台可用。在实践中,这实际上取决于具体情况,因为通常平台准备得非常快,如果不使用它,您不会注意到任何差异。但如果你想确定,你应该在任何地方使用它。