ionic 2 page change event

前端 未结 6 2505
深忆病人
深忆病人 2021-02-18 20:38

I want to execute some code every time the page changes.

I could add add an ngOnDestroy method to every page. It appears that I could use Ionic 2 page lifec

相关标签:
6条回答
  • 2021-02-18 21:12

    As of Ionic 3.6, you can use the App component to subscribe to application-wide page change events, as documented in : https://ionicframework.com/docs/api/components/app/App/

    For example, if you'd like to track every view change in Google Analytics using the GA cordova plugin, you could amend your app.component.ts like this :

    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));
      }
    }
    
    0 讨论(0)
  • 2021-02-18 21:16

    In Ionic2+ you can simply subscribe to the event you want to execute your code on as follows:

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

    You can subscribe to all the Lifecycle Events

    0 讨论(0)
  • 2021-02-18 21:17

    You can use plain old Javascript to be placed in app.component.ts. Assuming that you use 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');
          });
        });
      }
    

    Every time you change page using the NavController, you'll have page changed printed out in the console.

    0 讨论(0)
  • 2021-02-18 21:18

    Ionic2 doesn't use Angular2's Router. They have their own implementation NavController.


    I see that you can subscribe to Angular 2 Router events. How do I translate that for use in Ionic 2?

    You can merge all the NavController Events and subscribe to it.

    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);
    });
    
    0 讨论(0)
  • 2021-02-18 21:21

    Another option would be to create a super class where you can use the ionViewDidUnload method (or any other lifecycle hook) like this:

    import { Events } from 'ionic-angular';
    
    export class BasePage {
    
      constructor(public eventsCtrl: Events) { }
    
      ionViewDidEnter() {
        this.eventsCtrl.publish('page:load');   
      }
    
      ionViewDidUnload() {
        this.eventsCtrl.publish('page:unload');   
      }
    }
    

    Then in every page you just need to extend that 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);
    
        //...
    }
    

    And then, you can add a method like this one in the main app.ts file to respond to those events:

      private initializeEventHandlers() {
    
        this.events.subscribe('page:load', () => {
          // your code...
        });
    
        this.events.subscribe('page:unload', () => {
          // your code...
        });
    
      }
    
    0 讨论(0)
  • 2021-02-18 21:23

    1st thing Router is present in @angular/router module.

    And for listening route change event you can place subscription on router changes object.

    Code

    class MyRouteEventClass {
      constructor(private router: Router) {
         router.changes.subscribe((val) => {
           /* Awesome code here */
         }
        )
      }
    }
    
    0 讨论(0)
提交回复
热议问题