Как перезагрузить ионную страницу после pop() в ionic2
У меня есть 2 страницы Page1 and Page2
. Я использовал this.nav.pop()
в Page2, и он будет всплывать. Page2 и Page1 будут включены, но я хочу обновить страницу.
Заранее спасибо.
Ответы
Ответ 1
вы можете передать родительскую страницу вместе с навигационным нажатием. таким образом, вы можете перенести родительскую страницу как navParamter.
на родительской странице:
goToChildPage() {
this.navCtrl.push(ChildPage, { "parentPage": this });
}
а на дочерней странице перед попсом вы можете вызывать функции на родительской странице
this.navParams.get("parentPage").someFnToUpdateParent();
//or
this.navParams.get("parentPage").someFnToRefreshParent();
Ответ 2
Игнорируйте прямые версии angular, предложенные здесь, тем более, что вы используете Ionic 2, и предложения предполагают Ionic 1. Не начинайте смешивать слишком много прямого angular в вашем ионном приложении, если нет ионной реализации для чего вам нужно. Импортируйте "События" из ионного /angular2 на страницах Page1 и Page2, затем в Page2 сделайте что-то вроде
this.events.publish('reloadPage1');
this.nav.pop();
И в Page1 поместите
this.events.subscribe('reloadPage1',() => {
this.nav.pop();
this.nav.push(Page1);
});
Ответ 3
Возможно, вы захотите реализовать одну из них на своей странице:
ionViewWillEnter
ionViewDidEnter
Просмотрите документацию по NavController и жизненному циклу страницы:
http://ionicframework.com/docs/v2/api/components/nav/NavController/
Ответ 4
Простое решение, которое сработало для меня, снова вызывало метод get service в ionViewDidEnter
ionViewDidEnter() {
this.loadGetService();
}
Ответ 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
, чтобы перезагрузить страницу.
Ответ 7
Как сказал Джонатан, вы можете импортировать Events from ionic- angular, но вам не нужно снова нажать и снова нажать, вызвать ваши методы, чтобы перезагрузить только контент.
В стр. 2:
this.events.publish('reloadDetails');
this.navCtrl.pop();
В стр. 1:
this.events.subscribe('reloadDetails',() => {
//call methods to refresh content
});
Это работает для меня.
Ответ 8
Я просто загружаю детали на стр. 1 в функцию ionViewWillEnter (используя Ionic 2). Это относится как к начальной загрузке, так и к любому обновлению при возврате на страницу 1.
Документация здесь.
ionViewWillEnter
"Выполняется, когда страница собирается войти и стать активной страницей".
Ответ 9
Я нашел эту технику для перезагрузки страницы:
this.navCtrl.insert(1, MyPage);
this.navCtrl.pop();
Ответ 10
У меня была такая же проблема, и я потратил много часов на поиск и попытку решения.
Если я понимаю, ваша проблема:
Page 1 имеют некоторые привязки, которые вы получаете от API/Webservice.
Page 2 имеют некоторые входы, и при нажатии кнопки "Назад" (поп) вы хотите сохранить данные + обновить привязки Page 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 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. Я обновляю значения FormGroup на странице-2. Когда я появляю страницу-2, форма Page-1 не обновляется новыми значениями. Он не следил за изменениями.
Чтобы исправить это, я исправляю FormGroup самостоятельно после того, как Страница-2 была выскочена, но все еще находится в компоненте Страница-2.
Это более отзывчиво, но требует прямого вызова 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
В некоторых ситуациях вместо pop() вы можете использовать функцию push(). Когда вы вводите страницу с помощью функции push(), она перезагружается.
Также вы можете удалить страницу2 из навигации.
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
на navCtrlParam
push()
, как это было упомянуто в некоторых комментариях ранее.
Надеюсь, поможет!
ура
Unkn0wn0x