Comment recharger la page ion après pop () dans ionic2

j'ai 2 pages Page1 and Page2. J'ai utilisé this.nav.pop() dans la Page2 et il va pop la Page2 et la Page1 va activer mais je veux rafraîchir la Page1. Je vous remercie à l'avance.

22
demandé sur Akash Rao 2016-03-31 09:22:42

13 réponses

vous pouvez passer la page parent avec le nav push. de cette façon, vous pouvez accéder à la page mère en tant que navParamter.

dans la page parent:

 goToChildPage() {
    this.navCtrl.push(ChildPage, { "parentPage": this });
 }

et page enfant avant pop vous pouvez appeler des fonctions sur la page parent

this.navParams.get("parentPage").someFnToUpdateParent();
  //or
this.navParams.get("parentPage").someFnToRefreshParent();
23
répondu noel zubin 2016-11-29 17:21:33

ignorez les implémentations angulaires directes suggérées ici, d'autant plus que vous utilisez Ionic 2 et que les suggestions supposent Ionic 1. Ne commencez pas à mélanger trop de direct angular dans votre application ionique à moins qu'il n'y ait pas d'implémentation ionique pour ce dont vous avez besoin. Importez "Events" de ionic / angular2 à la fois à la Page1 et à la Page2, puis à la Page2 faites quelque chose comme

this.events.publish('reloadPage1');
this.nav.pop();
this.events.subscribe('reloadPage1',() => {
 this.nav.pop();
 this.nav.push(Page1);
});
19
répondu Jonathan Bardi 2016-04-02 16:13:05

Vous pouvez mettre en œuvre l'un de ces dans votre page:

ionviewwwillenter ionViewDidEnter

veuillez consulter la documentation sur le cycle de vie du navController et de la page: http://ionicframework.com/docs/v2/api/components/nav/NavController/

13
répondu user2674268 2016-08-24 21:08:33

solution Simple qui a fonctionné pour moi a été d'obtenir de l'appel de la méthode de service de nouveau dans ionViewDidEnter

ionViewDidEnter() {
    this.loadGetService();
}
11
répondu Marko 2017-09-27 14:11:47

Vous pouvez envisager d'envoyer un événement avant d'appeler this.nav.pop pour la page 1 de se recharger.

3
répondu gucheen 2016-03-31 06:58:31

PAGE 1:

import { Events } from 'ionic-angular'
constructor(public events:Events){
   this.listenEvents();
}
... ...
listenEvents(){
   this.events.subscribe('reloadDetails',() => {
    //call methods to refresh content
   });
}

PAGE 2:

import { Events } from 'ionic-angular'
constructor(public events:Events, public navCtrl:NavController){
}

function(){
   this.events.publish('reloadDetails');
   this.navCtrl.pop();
}

entrer le code ici

3
répondu Silver Wing 2017-10-18 11:06:45

à la page2:

this.events.publish('reloadDetails');
this.navCtrl.pop();

à la page1:

this.events.subscribe('reloadDetails',() => {
    //call methods to refresh content
});

Qui fonctionne pour moi.

2
répondu Dave 2017-07-26 14:58:43

j'ai trouvé cette technique pour recharger une page:

this.navCtrl.insert(1, MyPage);
this.navCtrl.pop();
1
répondu SiteXw 2017-03-22 21:33:11

j'ai eu le même problème et passer de nombreuses heures à chercher et à essayer la solution.

Si je comprends bien, ton problème est:

Page 1 ont quelques reliures que vous obtenez d'une API / Webservice.

Page 2 ont quelques entrées et en appuyant sur le bouton Précédent (pop) vous voulez enregistrer des données + rafraîchir les fixations de la Page 1.

la façon dont je l'ai résolu a été la lecture d'un post sur StackOverflow que maintenant je ne peux pas trouver : (!!

La solution est d'utiliser un service Injectable.

PAGE 1:

/* IMPORTS */

import { App, Nav, NavParams } from 'ionic-angular';
import { Oportunidades } from '../../services/oportunidades.service';

/* SOME BINDINGS HERE */ 
{{oportunidades.mesActual.num_testdrive}}

/* CONSTRUCTOR */
  constructor(
    private oportunidades: Oportunidades, // my injectable service!
    public app: App,
    public nav: Nav,
    public params: NavParams
  ) {

// Call to the Injectable Service (named oportunidades):
    this.oportunidades.getOportunidades();
  }

INJECTABLE SERVICE:

/* IMPORTS */ 
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';

@Injectable()
export class Oportunidades {

  public url = 'http://your-API.URL';
  public data: Observable<Object>;
  public mesActual: Object = [];

  constructor(private http: Http){
    //GET API DATA
    this.data = http.get(this.url).map(res => res.json());
  }

  getOportunidades() {
    this.data.subscribe(data => {
      this.mesActual = new MesActual(
        data["mes_actual_slide"].num_testdrive,
        ...
        //Here I get the API data and set it on my injectable object
      );
    });
  }
}

PAGE 2:

/* SOME IMPORTS */
import { NavController } from 'ionic-angular';
import { UserData } from '../../services/data.service';
import { Oportunidades } from '../../services/oportunidades.service';
import { Http, Headers, URLSearchParams } from '@angular/http';

/* SOME example BINDINGS and INPUTS: */
@Component({
  template: `
  {{ day[selectedDay].dia }}
    Input data: 
    <ion-input type="number" clearOnEdit="true"
      #ventas id="ventas" value={{day[selectedDay].ventas}}
      (keyup)="setVal(ventas.value, $event)">
    </ion-input>
  `,
  providers: [
  ]
})

export class PageInsert {

  constructor(
    public navCtrl: NavController,
    private http: Http,
    private userData: UserData,
    public oportunidades: Oportunidades // my injectable service!
  ) {

    send(selectedDay){
      var url = 'http://your.api.url/senddata';

      // I SAVE data TO API / Webservice
      this.http.post(url, params, { headers: headers })
      .map(res => res.json())
      .subscribe(
        data => { 
          console.log(data); 
          // Here i'll call to the Injectable service so It refresh's the new data on Page1 
         // in my case, this send function is called when "pop" or "back" button of ionic2 is pressed
         // This means: On click on back button -> Save and refresh data of the Injectable that is binded with the Page1
          this.oportunidades.getOportunidades(); 
          return true; },
        error => { 
          console.error("Error saving!"); 
        }
       );
    }
}

j'espère que cela peut vous aider!! Demandez des problèmes similaires:)

1
répondu gtamborero 2017-04-21 23:01:26

je passe un FormGroup de Page-1 à Page-2. Je mets à jour les valeurs de FormGroup dans la Page-2. Quand je pop Page-2, le formulaire de Page-1 n'est pas mis à jour avec les nouvelles valeurs. Il n'a pas été à regarder pour les changements.

pour corriger cela, je patche le FormGroup avec lui-même après que la Page-2 a été activée mais toujours dans le composant Page-2.

Ceci est plus réactif, mais nécessite un appel à close().

// Page-2 close method
public close(): void {
    this.navCtrl.pop();
    this.formGroup.patchValue(this.formGroup.value);
}

tout cela est général, mais je vois le rafraîchissement sur la Page-1.

// Page-2 nav controller page event method
ionViewWillUnload() {
    this.formGroup.patchValue(this.formGroup.value);
}
1
répondu Brian Duguid 2017-05-31 19:41:40

dans certaines situations au lieu de pop() vous pouvez utiliser la fonction push (). Lorsque vous entrez la page avec la fonction push (), elle est rechargée. Vous pouvez également supprimer la page2 de la navigation.

 this.navCtrl.push(TabsPage).then(() => {
   const index = this.viewCtrl.index;
   this.navCtrl.remove(index);
   });

Ou si vous avez plus d'une page par exemple page1->page2->pag3:

this.navCtrl.push(TabsPage).then(() => {
const index = this.viewCtrl.index;
this.navCtrl.remove(index, 2); //this will remove page3 and page2
});
1
répondu Besart Domazeti 2017-06-22 09:53:52

j'ai simplement charger les détails dans la page 1 dans une ionViewWillEnter fonction (en utilisant Ionique 2). Cela permet de gérer à la fois la charge initiale et tout rafraîchissement lors du retour à la page 1.

la Documentation est ici.

ionviewwwillenter

"S'exécute lorsque la page est sur le point d'entrer et devient la page active."

1
répondu AndrWeisR 2017-12-04 23:07:18
ionViewWillEnter() {
    this.refresh();
}

ionViewWillEnter sera appelé juste avant que vous (re)visualisiez la page

-1
répondu Luca C. 2018-02-28 16:37:16