如何在ionic2中的pop()之后重新加载离子页面

Posted

技术标签:

【中文标题】如何在ionic2中的pop()之后重新加载离子页面【英文标题】:How to reload the ion-page after pop() in ionic2 【发布时间】: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。希望这会有所帮助。 【参考方案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 页绑定。

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

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

第 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】:

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

https://forum.ionicframework.com/t/ionviewdidenter-is-not-invoked-on-leaving-a-pushed-page/131144/19?u=unkn0wn0x

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

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

希望对你有帮助!

干杯 未知0wn0x

【讨论】:

以上是关于如何在ionic2中的pop()之后重新加载离子页面的主要内容,如果未能解决你的问题,请参考以下文章

单击离子页脚中的按钮首先不执行(单击)功能

加载重新加载页面时如何删除数组中的所有对象?

如何解决Ionic2应用程序中的空白屏幕错误?

从ionic2中的资产文件夹加载字体时出错

尝试使用 VS Code 调试 Ionic 项目时出现 Ionic 2 实时重新加载服务器错误

离子滑动循环技巧 - 不更新