2017-02-21 13 views
2

У меня есть следующий навигационный-случай:Ионные 2 Угловое NavController, выскочить обратно на второй последней странице

Home -> navCtrl.push(SearchPage) -> navCtrl.push(ResultPage) 

или

Home -> navCtrl.push(SearchPage) -> navCtrl.push(ResultPage) -> navCtrl.push(DetailPage) 

Я хочу вернуться обратно SearchPage. В первом случае, нет никаких проблем, я могу использовать

this.navCtrl.pop() 

Но, во втором случае, я пытаюсь использовать

this.navCtrl.popTo(SearchPage) 

и это не работает, как ожидалось. Ионный навигатор только одну страницу обратно в стек. Я знаю, что есть проблема с popTo() (https://github.com/driftyco/ionic/issues/6513)

Как я могу решить эту проблему?

ответ

1

нормально, нашел решение. Похоже, что это работает ... по крайней мере на данный момент

this.navCtrl 
     .push(SearchPage) 
     .then(() => { 

      const index = this.viewCtrl.index; 

      for(let i = index; i > 0; i--){ 
       this.navCtrl.remove(i); 
      } 

     }); 
0

Вы можете сделать это, изменив стек навигационного контроллера, используя метод insertPage.

this.nav.insertPages(0, [{page: your_home_page}, {page: SearchPage}]); 
this.nav.pop(); 

Здесь 0 относится к положению, в которое вы хотите вставить свою страницу. В приведенном выше коде 0 будет вашей домашней страницей, а 1 будет вашей страницей поиска. Используйте эту команду в свой DetailPage для навигации по всплытию в SearchPage.

Для получения дополнительной информации посетите http://ionicframework.com/docs/v2/api/navigation/NavController/

+0

Спасибо, но эффекта нет. Он перемещает только одну страницу назад. 'getSearchPage() { this.navCtrl.insertPages (0, [{страница: HomePage}, {страница: SearchPage}]); this.navCtrl.pop(); } ' – hydrococcus

+0

попробуйте добавить this.navCtrl.remove (0); перед добавлением других строк кода. Это помогает удалить страницу из стека с 0-го постов – AishApp

+0

Отсутствие эффекта снова. Я в недоумении. – hydrococcus

3

Попробуйте это! После того, как вы в DetailPage, сделайте следующее:

this.navCtrl.remove(2,1); // This will remove the 'ResultPage' from stack. 
this.navCtrl.pop(); // This will pop the 'DetailPage', and take you to 'SearchPage' 
1
this.nav.push(AnotherPage) 
.then(() => { 
    const index = this.viewCtrl.index; 
    this.nav.remove(index); 
}); 
1
this.navController.push(SearchPage).then(() => { 
    const index = this.viewCtrl.index; 
    this.navController.remove(index, 1); //this will remove page3 and page2 
}); 

Включите этот код в компоненте.

0

Я также столкнулся с той же проблемой и нашел решение, оно похоже на принятый ответ, но без цикла и немного больше деталей, поэтому я надеюсь, что это поможет кому-то понять это.

Так вот поток:

Home -> navCtrl.push(SearchPage) -> navCtrl.push(ResultPage) -> navCtrl.push(DetailPage) 

А вот соответствующий индекс:

Home: 0 
SearchPage: 1 
ResultPage: 2 
DetailPage: 3 

Если вы хотите вернуться к SearchPage из DetailPage, вы в основном хотите удалить ResultPage из когда вы нажимаете DetailPage.

Так попробуйте этот код на ResultPage, когда вы нажимаете DetailPage:

// First get the index of ResultPage, it should return 2. 
let resultIndex = this.navCtrl.last().index; 

// Push DetailPage. 
this.navCtrl.push(DetailPage).then(() => { 
    // Once it's pushed, this block is called and now we can remove the ResultPage from the stack. 
    this.navCtrl.remove(resultIndex, 1); 
    // second parameter is optional and defaults to 1, if you want to remove more pages from stack start with the bottom most index you want to remove and pass number of pages you want to remove starting from the given index. 

}); 

Надеется, что это помогает кто-то где-то.

0

Я ответил на аналогичный вопрос здесь, и он, похоже, подходит и для вас. Поскольку я ленив загружать модули, popTo() работает только при передаче объекта из массива NavController.getViews(). С учетом сказанного, вы можете попробовать что-то вроде этого:

let targetView = this._navCtrl.getViews().filter(view=> view.id == 'MyAwesomePage') 
targetView.length ? this._navCtrl.popTo(targetView[0]) : this._navCtrl.pop() 

Или что-то более многословный, как это:.

let index: number; 
let views: any[] = this._navCtrl.getViews() 
let found: boolean = views.some((view, i) =>{ 
    index = i 
    return (view.id == 'MyAwesomePage') 
}) 
found ? this._navCtrl.popTo(views[index]) : this._navCtrl.pop() 

Если вы хотите изменить порядок, вы можете getViews() обратный() .filter() или views.reverse(). some(). Это с Ionic 3 и ES5 Array.some()