【问题标题】:How to reload the ion-page after pop() in ionic2如何在ionic2中的pop()之后重新加载离子页面
【发布时间】:2016-07-19 10:46:17
【问题描述】:

我有 2 页 Page1 and Page2。我在 Page2 中使用了this.nav.pop(),它会弹出 Page2 并且 Page1 将启用,但我想刷新 Page1。 先感谢您。

【问题讨论】:

  • this.nav.pop() 用于?
  • this.nav.pop() 用于弹出Page2
  • @AkashRao 你是在刷新整个页面后还是只是页面中的数据?我问的原因是,Angular 2 已经投入了大量工作,只更新 DOM,当它需要更新时,刷新整个页面可能会过大,具体取决于您要实现的目标。
  • 有一个解决方案here,当您重新进入允许您刷新数据的页面时会调用 onPageWillEnter。希望这会有所帮助。

标签: javascript angular ionic2


【解决方案1】:

您可以将父页面与导航推送一起传递。这样您就可以将父页面作为 navParamter 访问。
在父页面中

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

在弹出之前的子页面中,您可以调用父页面上的函数

this.navParams.get("parentPage").someFnToUpdateParent();
  //or
this.navParams.get("parentPage").someFnToRefreshParent();

【讨论】:

  • 谢谢!解决这个问题的最佳方法,恭喜!
  • 太棒了,谢谢!
  • 我尝试使用参数调用父页面的函数,但没有成功。似乎它没有通过args。但没有争论是一种魅力。顺便说一句,我从来不知道我们可以通过这种方式调用 Pages 上的函数。谢谢。
  • 这个解决方案正在打破 OOP,订阅->发布事件或通过页面生命周期事件 ionViewDidEnter 我猜应该是理想的选择
  • @Naga 我刚试过这个。你是对的,它似乎确实是理想的选择。这是下面其他人提到的解决方案。
【解决方案2】:

忽略此处建议的直接角度实现,特别是因为您使用的是 Ionic 2 并且建议假设 Ionic 1。不要开始在您的 ionic 应用程序中混合太多直接角度,除非没有您需要的 ionic 实现.在 Page1 和 Page2 中从 ionic/angular2 导入“事件”,然后在 Page2 中执行类似

this.events.publish('reloadPage1');
this.nav.pop();

在第1页放

this.events.subscribe('reloadPage1',() => {
 this.nav.pop();
 this.nav.push(Page1);
});

【讨论】:

  • 这可行,但让 UI 从 Page1 闪回一个页面然后再次前进到 page1 看起来不太好
  • 这是一个很好的解决方案,但subscribe 中的poppush 不是。相反,您可以在 Page1 中有一个初始化函数,您可以在 subscribe 中调用它。
【解决方案3】:

您可能希望在您的页面中实现其中之一:

ionViewWillEnter ionViewDidEnter

请查看 navController 和页面生命周期文档: http://ionicframework.com/docs/v2/api/components/nav/NavController/

【讨论】:

  • ionViewWillEnter ionViewDidEnter 在“弹出”(后退按钮)时不起作用,所以我认为这不是一个好选择
  • ionViewWillEnter 非常感谢推送和弹出操作
【解决方案4】:

对我有用的简单解决方案是在 ionViewDidEnter

中再次调用 get 服务方法
ionViewDidEnter() {
    this.loadGetService();
}

【讨论】:

  • 很好的解决方案。虽然 ionViewDidEnter 不需要返回任何东西。这是一个空白。
【解决方案5】:

在第 1 页:

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

第 2 页:

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

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

【讨论】:

    【解决方案6】:

    您可以考虑在调用 this.nav.pop 之前发送一个事件,让页面 1 自行重新加载。

    【讨论】:

    • 嗨,gucheen,你能给我看一个在pop之前调用事件的示例代码吗?
    • 就像在 Angular 中一样,在第 2 页使用 $emit,在第 1 页使用 $on
    【解决方案7】:

    就像乔纳森说的,你可以从 ionic-angular 导入事件,但你不需要再次推送和弹出,调用你的方法来只重新加载内容。

    在第 2 页中:

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

    在第 1 页:

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

    这对我有用。

    【讨论】:

      【解决方案8】:

      我只是在 ionViewWillEnter 函数中加载第 1 页中的详细信息(使用 Ionic 2)。这将处理初始加载和弹回第 1 页时的任何刷新。

      文档是here

      ionViewWillEnter
      "在页面即将进入并成为活动页面时运行。"

      【讨论】:

        【解决方案9】:

        我发现了这种重新加载页面的技术:

        this.navCtrl.insert(1, MyPage);
        this.navCtrl.pop();
        

        【讨论】:

        • 哟,你到底是从哪里得到你的参数的?如果您有想要再次使用的计算参数,您会怎么做?您的回答不是解决方案,任何人都不应该根据他的要求使用此代码!
        • 我认为最好的解决方案是复制收到的参数并将它们重新注入“插入”(this.navCtrl.insert(1, MyPage, paramsCopy});)。
        • 我认为它在大多数情况下仍然无法使用,您需要重新初始化整个控制器。
        【解决方案10】:

        我遇到了同样的问题,花了很多时间寻找和尝试解决方案。

        如果我理解,您的问题是:

        第 1 页有一些您从 API/Web 服务获得的绑定。

        第 2 页有一些输入,当按下返回按钮 (pop) 时,您想要保存数据 + 刷新第 1 页绑定。

        我解决它的方法是阅读 StackOverflow 上的一篇文章,现在我找不到了 :( !!

        解决方案是使用可注入服务。

        第 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();
          }
        

        注射服务:

        /* 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
              );
            });
          }
        }
        

        第 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!"); 
                }
               );
            }
        }
        

        希望对你有帮助!!询问任何类似的问题:)

        【讨论】:

          【解决方案11】:

          我在一个类似的问题上花了一天半的时间。解决方案真的是反气候。

          我将 FormGroup 从第 1 页传递到第 2 页。我更新了 Page-2 中的 FormGroup 值。当我弹出第 2 页时,第 1 页的表单不会使用新值更新。它一直没有关注变化。

          为了解决这个问题,我在 Page-2 被弹出但仍然在 Page-2 组件中之后用自身修补了 FormGroup。

          这样响应速度更快,但需要直接调用 close()。

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

          这是包罗万象的,但我确实在第 1 页上看到了刷新。

          // Page-2 nav controller page event method
          ionViewWillUnload() {
              this.formGroup.patchValue(this.formGroup.value);
          }
          

          【讨论】:

            【解决方案12】:

            在某些情况下,您可以使用 push() 函数代替 pop()。当您使用 push() 函数进入页面时,它会重新加载。 您也可以从导航中删除 page2。

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

            或者如果您有多个页面,例如 page1->page2->pag3:

            this.navCtrl.push(TabsPage).then(() => {
            const index = this.viewCtrl.index;
            this.navCtrl.remove(index, 2); //this will remove page3 and page2
            });
            

            【讨论】:

              【解决方案13】:
              ionViewWillEnter() {
                  this.refresh();
              }
              

              ionViewWillEnter 将在您(重新)可视化页面之前被调用

              【讨论】:

                【解决方案14】:

                请查看我在此处发布的解决方案:

                也许您可以根据自己的需要进行调整。

                我的主要意图是防止将带有this 的整个模块作为navCtrlParam 传递到push() 的页面中,就像之前在某些cmets 中提到的那样。

                希望对你有帮助!

                干杯
                未知0wn0x

                【讨论】:

                  猜你喜欢
                  • 2011-09-05
                  • 2016-09-19
                  • 2013-06-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-23
                  • 1970-01-01
                  • 2016-11-03
                  • 1970-01-01
                  相关资源
                  最近更新 更多