导航到推送通知有效负载

时间:2017-04-12 03:25:22

标签: ionic2

我有一个ionic2应用程序接收来自ionic.io的推送通知。在通知有效负载上,我正在发送要导航到的所需路由。

let route = notification.payload.route;

if (route) {
  that.navCtrl.push(route, notification.payload);
}

问题是有效负载是一个字符串,而navCtrl期望接收路由值。与此导入中的 myPage 一样:

import { myPage } from '../pages.ts';

转换字符串的最佳方法是什么?或者如果有更好的方法可以做到这一点,请随意提及。谢谢。

1 个答案:

答案 0 :(得分:2)

如果导航选项有限,您可以使用开关将用户发送到页面,例如:

let route = notification.payload.route;

if (route) {
  switch(route){
    case 'home':
      that.navCtrl.push(MyHomePage, notification.payload);
      break;

    case 'Users':
      that.navCtrl.push(MyUsersPage, notification.payload);
      break;

    case ...
  }
}

这不是最美丽的方式,但应该有效。

编辑 - IONIC 3懒惰加载方式

因此,由于您只想使用包含页面选择器的字符串,我认为能够执行此操作的唯一方法是使用延迟加载组件。

在您开始之前,如果您的项目不在Ionic 3上,请按照Changelog步骤进行升级。

1)您需要从app.module.ts entryComponentsdeclatarions删除要延迟加载的页面,当然还要删除页面导入。 所以从这个

import { HomePage } from '../pages/home';

@NgModule({
  declarations: [
    MyApp, HomePage
  ],
  imports: [
    ...
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp, HomePage
  ],
  providers: [
    ...
  ]
})

它看起来像这样:

@NgModule({
  declarations: [
    MyApp
  ],
  imports: [
    ...
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp
  ],
  providers: [
    ...
  ]
})

2)在每个延迟加载的文件夹中,您有3个文件,例如

-home
|- home.html
|- home.scss
|- home.ts

您需要创建另一个文件home.module.ts

3)在您的home.module.ts上,您需要此代码

import { NgModule } from '@angular/core';
import { HomePage } from './home';
import { IonicPageModule } from 'ionic-angular';

@NgModule({
    declarations: [HomePage],
    imports: [IonicPageModule.forChild(HomePage)],
})
export class HomePageModule { }

4)在home.ts上,您需要导入IonicPage装饰器并在@Component装饰器上方使用

import { IonicPage } from 'ionic-angular';

@IonicPage()
@Component({
    selector: 'home',
    templateUrl: 'home.html'
})

5)现在您已准备好使用延迟加载,您不需要导入页面,然后在推送/弹出页面时再使用它,您需要将其作为字符串传递。 因此,如果您现在使用this.navCtrl.push(HomePage, data);,则可以使用this.navCtrl.push('HomePage', data);并让深层链接为您处理。

如果您需要了解更多信息,请参阅此lazy loading doc,了解如何实现此功能,但据我所知,这是您通过传递字符串值使用路由的唯一方法。

希望这会有所帮助:)