web-dev-qa-db-fra.com

ionic 2 événement de changement de page

Je veux exécuter du code chaque fois que la page change.

Je pourrais ajouter ajouter une méthode ngOnDestroy à chaque page. Il semble que je pourrais utiliser Ionic 2 page hooks du cycle de vie (par exemple ionViewDidUnload) pour le même effet, mais je n'ai pas pris la peine de tester Je préfère ajouter une seule méthode à la classe principale de l'application.

Je vois que vous pouvez vous abonner à Angular 2 Router events . Comment traduire cela pour l'utiliser dans Ionic 2? I ') m obtient une erreur avec import { Router } from '@angular/router; en premier lieu:

TypeScript error: <path>/node_modules/@angular/router/src/common_router_providers.d.ts(9,55): Error TS2305: Module '"<path>/node_modules/@angular/core/index"' has no exported member 'NgModuleFactoryLoader'.
TypeScript error: <path>/node_modules/@angular/router/src/router.d.ts(14,39): Error TS2305: Module '"<path>/node_modules/@angular/core/index"' has no exported member 'NgModuleFactoryLoader'.
TypeScript error: <path>/node_modules/@angular/router/src/router_module.d.ts(9,10): Error TS2305: Module '"<path>/node_modules/@angular/core/index"' has no exported member 'ModuleWithProviders'.

config webpack

var path = require('path');


module.exports = {
  entry: [
    path.normalize('es6-shim/es6-shim.min'),
    'reflect-metadata',
    path.normalize('zone.js/dist/zone'),
    path.resolve('app/app.ts')
  ],
  output: {
    path: path.resolve('www/build/js'),
    filename: 'app.bundle.js',
    pathinfo: false // show module paths in the bundle, handy for debugging
  },
  module: {
    loaders: [
      {
        test: /\.ts$/,
        loader: 'awesome-TypeScript',
        query: {
          doTypeCheck: true,
          resolveGlobs: false,
          externals: ['typings/browser.d.ts']
        },
        include: path.resolve('app'),
        exclude: /node_modules/
      }
    ],
    noParse: [
      /es6-shim/,
      /reflect-metadata/,
      /zone\.js(\/|\\)dist(\/|\\)zone/
    ]
  },
  resolve: {
    alias: {
      'angular2': path.resolve('node_modules/angular2')
    },
    extensions: ["", ".js", ".ts"]
  }
};

Cela aurait plus de sens pour moi de toute façon s'il existe un moyen d'utiliser le service Nav ou NavController de ionic-angular. Y-a-t-il un moyen de faire ça?

20
jmilloy

Ionic2 n'utilise pas Angular2's Router. Ils ont leur propre implémentation NavController.


Je vois que vous pouvez vous abonner aux événements de routeur Angular 2. Comment puis-je traduire cela pour une utilisation dans Ionic 2?

Vous pouvez fusionner tous les NavController Events et abonnez-vous.

allEvents = Observable.merge(
                 this.navController.viewDidLoad, 
                 this.navController.viewWillEnter, 
                 this.navController.viewDidEnter, 
                 this.navController.viewWillLeave, 
                 this.navController.viewDidLeave, 
                 this.navController.viewWillUnload);

allEvents.subscribe((e) => {
    console.log(e);
});
11
Ankit Singh

Une autre option serait de créer une super classe où vous pouvez utiliser la méthode ionViewDidUnload (ou tout autre hook de cycle de vie) comme ceci:

import { Events } from 'ionic-angular';

export class BasePage {

  constructor(public eventsCtrl: Events) { }

  ionViewDidEnter() {
    this.eventsCtrl.publish('page:load');   
  }

  ionViewDidUnload() {
    this.eventsCtrl.publish('page:unload');   
  }
}

Ensuite, dans chaque page, il vous suffit de extend que BasePage

@Component({
  templateUrl: 'build/pages/my-page/my-page.html',
})
export class MyPage extends BasePage {

constructor(private platform: Platform,
              private nav: NavController, 
              private menuCtrl: MenuController,
              ...,
              eventsCtrl: Events) //notice that this one does not have the private/public keyword 
  {    

    // Due to an issue in angular, by now you must send the dependency to the super class
    // https://github.com/angular/angular/issues/5155
    super(eventsCtrl);

    //...
}

Et puis, vous pouvez ajouter une méthode comme celle-ci dans le principal app.ts fichier pour répondre à ces événements:

  private initializeEventHandlers() {

    this.events.subscribe('page:load', () => {
      // your code...
    });

    this.events.subscribe('page:unload', () => {
      // your code...
    });

  }
11
sebaferreras

À partir de Ionic 3.6, vous pouvez utiliser le composant App pour vous abonner aux événements de changement de page à l'échelle de l'application, comme indiqué dans: https://ionicframework.com/docs/api/ composants/app/App /

Par exemple, si vous souhaitez suivre chaque changement de vue dans Google Analytics à l'aide du plug-in GA cordova), vous pouvez modifier votre app.component.ts comme ceci:

constructor(private app: App, private platform: Platform, private ga: GoogleAnalytics, ...) {
  this.platform.ready().then(() => {
    this.ga.startTrackerWithId('UA-XXX').then(() => {
      this.app.viewDidEnter.subscribe((evt) => {
        // evt.instance is the Ionic page component
        this.ga.trackView(evt.instance.title);
      });
    }).catch(e => console.log('Doh', e));
  }
}
10
jean-baptiste

1ère chose que le routeur est présent dans @angular/router module.

Et pour écouter l'événement de changement de route, vous pouvez placer un abonnement sur l'objet routeur changes.

Code

class MyRouteEventClass {
  constructor(private router: Router) {
     router.changes.subscribe((val) => {
       /* Awesome code here */
     }
    )
  }
}
5
Pankaj Parkar

Vous pouvez utiliser du vieux Javascript pour être placé dans app.component.ts. En supposant que vous utilisez Ionic2-RC0:

import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from 'ionic-native';

import { YourPage } from '../pages/yourpage/yourpage';

@Component({
  template: `<ion-nav [root]="rootPage"></ion-nav>`
})
export class MyApp {
  rootPage = YourPage;

  constructor(platform: Platform) {
    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.
      StatusBar.styleDefault();
      window.addEventListener('load', () =>{
         console.log('page changed');
      });
    });
  }

Chaque fois que vous changez de page à l'aide de NavController, vous aurez page changed imprimé dans la console.

5
Mathieu Nls

Dans Ionic2 +, vous pouvez simplement vous abonner à l'événement sur lequel vous souhaitez exécuter votre code comme suit:

this.navCtrl.ionViewWillUnload.subscribe(view => {
    console.log(view);
});

Vous pouvez vous abonner à tous les Lifecycle Events

2
Dhyey