2ページ__Page1 and Page2
_あります。 Page2でthis.nav.pop()
を使用しました。Page2がポップされ、Page1が有効になりますが、Page1を更新します。前もって感謝します。
親ページとnavプッシュを渡すことができます。そうすれば、親ページをnavParamterとしてアクセスできます。
親ページ内:
goToChildPage() {
this.navCtrl.Push(ChildPage, { "parentPage": this });
}
子ページポップの前に、親ページの関数を呼び出すことができます
this.navParams.get("parentPage").someFnToUpdateParent();
//or
this.navParams.get("parentPage").someFnToRefreshParent();
特にangular 2を使用しており、提案はIonic 1.を想定しているため、ここで提案されている直接のIonic実装を無視します直接のangularをionicアプリ内でionic Page1とPage2の両方でionic/angular2から「イベント」をインポートしてから、Page2で次のようにします。
this.events.publish('reloadPage1');
this.nav.pop();
そしてPage1
this.events.subscribe('reloadPage1',() => {
this.nav.pop();
this.nav.Push(Page1);
});
ページに次のいずれかを実装できます。
ionViewWillEnter ionViewDidEnter
NavControllerおよびページライフサイクルのドキュメントを確認してください: http://ionicframework.com/docs/v2/api/components/nav/NavController/
私のために働いた簡単な解決策は、ionViewDidEnterでget serviceメソッドを再度呼び出すことでした
ionViewDidEnter() {
this.loadGetService();
}
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();
}
ここにコードを入力してください
this.nav.pop
を呼び出す前にイベントを送信して、ページ1自体をリロードすることを検討してください。
IonViewWillEnter関数でページ1の詳細を読み込むだけです(Ionic 2)を使用します。これにより、ページ1に戻るときに初期読み込みと更新の両方が処理されます。
ドキュメントは こちら です。
ionViewWillEnter
「ページがアクティブなページに入り、アクティブなページになる直前に実行されます。」
ジョナサンが言ったように、イベントはionic-angularからインポートできますが、プッシュとポップを再度行う必要はなく、メソッドを呼び出してコンテンツのみをリロードします。
2ページ目:
this.events.publish('reloadDetails');
this.navCtrl.pop();
1ページ目:
this.events.subscribe('reloadDetails',() => {
//call methods to refresh content
});
それは私のために働く。
同様の問題に1日半費やしました。解決策は本当に耐気候です。
Page-1からPage-2にFormGroupを渡します。ページ2のFormGroup値を更新します。 Page-2を開くと、Page-1のフォームは新しい値で更新されません。変更を監視していません。
これを修正するために、ページ2がポップされた後、ページ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);
}
ページをリロードするためのこのテクニックを見つけました:
this.navCtrl.insert(1, MyPage);
this.navCtrl.pop();
私は同じ問題を抱えていて、解決策を探して試すのに何時間も費やしました。
私が理解した場合、あなたの問題は次のとおりです。
ページ1には、API/Webサービスから取得するバインディングがいくつかあります。
ページ2にはいくつかの入力があり、戻るボタン(ポップ)を押すと、データを保存し、ページ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!");
}
);
}
}
私はそれがあなたを助けることができることを願っています!!同様の問題を求めてください:)
状況によっては、pop()の代わりにPush()関数を使用できます。 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
});
ionViewWillEnter() {
this.refresh();
}
ionViewWillEnterは、ページを(再)視覚化する直前に呼び出されます