Ionic-framework: Ionic2 - nav.setRoot (Component) - работает только в первый раз, после этого невозможно перейти, ошибок не сообщается.

Созданный на 18 мар. 2016  ·  100Комментарии  ·  Источник: ionic-team/ionic-framework

Краткое описание проблемы:

Я разрабатываю приложение с Ionic2. У меня есть App.ts в качестве родителя, Welcome.ts в качестве дочерней страницы и Featured.ts в качестве дочерней страницы. У меня есть firebase, интегрированный с приложением. Корневая страница сначала настроена на приветствие.

this.rootPage = Welcome;

Шаг 1: Я нажимаю кнопку «Добро пожаловать», чтобы пройти аутентификацию в Google, после вызова onAuth я устанавливаю this.nav.setRoot(Featured); . До сих пор все работает нормально. Я попадаю на избранную страницу, которая включает боковое меню с разными страницами, и я могу без проблем перейти ко всем из них.

Шаг 2: Featured включает боковое меню из App.ts/html, там у меня есть кнопка выхода из системы, которая вызывает unauth.
Unauth отменяет аутентификацию Firebase, а затем:

this.menu.close();    
let nav = this.app.getComponent('nav');    
nav.setRoot(Welcome); 

Шаг 3: Войдите снова так же, как на шаге 1. До сих пор все в порядке.

Шаг 4: Откройте боковое меню, выберите любую из страниц из бокового меню, навигация не происходит. боковое меню закрывается, но страница остается прежней, кнопка значка панели навигации исчезает, и навигация не происходит.
Код openPage:

  openPage(page) {
    //1. Loop through and set active attribute to False if it doesn't match.
    //   Set to True if it matches page title
    for(var i = 0; i < this.NavPages.length; i++) {
      if(this.NavPages[i].title == page.title) this.NavPages[i].active = true;
      else this.NavPages[i].active = false;
    }
    for(var i = 0; i < this.ActivityPages.length; i++) {
      if(this.ActivityPages[i].title == page.title) this.ActivityPages[i].active = true;
      else this.ActivityPages[i].active = false;
    }
    for(var i = 0; i < this.PreferencesPages.length; i++) {
      if(this.PreferencesPages[i].title == page.title) this.PreferencesPages[i].active = true;
      else this.PreferencesPages[i].active = false;
    }

    //2. close the menu when clicking a link from the menu
    this.menu.close();
    //3. navigate to the new page if it is not the current page
    let nav = this.app.getComponent('nav');
    nav.setRoot(page.component);
  }

Какое поведение вы ожидаете?

Я ожидаю, что навигация продолжится, подобно тому, что происходит на шаге 1.

Действия по воспроизведению:
Шаги для воспроизведения включены выше.

Code included above.

Другая информация: (например, трассировки стека, связанные проблемы, предложения по устранению, ссылки на stackoverflow, ссылки на форумы и т. д.)
К сожалению, ошибка не выдается. Я не вижу никаких ошибок в журналах консоли.

Какая ионная версия? 2.х

Запустите ionic info из командной строки терминала/команды: (вставьте вывод ниже)

Your system information:

Cordova CLI: 6.0.0
Gulp version:  CLI version 3.9.0
Gulp local:   Local version 3.9.1
Ionic Version: 2.0.0-beta.3
Ionic CLI Version: 2.0.0-beta.19
Ionic App Lib Version: 2.0.0-beta.9
ios-deploy version: 1.8.2 
ios-sim version: 5.0.3 
OS: Mac OS X El Capitan
Node Version: v0.12.7
Xcode version: Xcode 7.2.1 Build version 7C1002 

Спасибо.

Самый полезный комментарий

Почему этот вопрос закрыт? Навигация кажется действительно сломанной. Если я нажму страницу с формами, она тоже не сработает.

Все 100 Комментарий

Заметил следующее: в dom присутствуют сразу 2 страницы ion.
screen shot 2016-03-18 at 3 34 03 pm

Тот, к которому я перешел, - это «исследование», у которого z-индекс (92) ниже, чем у «избранной» страницы. Поэтому я должен быть в разделе «Исследовать», но «избранное» накладывается поверх «исследования» с z-индексом 93.

У меня такая же проблема, но в моем случае я даже не могу перенаправиться после входа в систему.

Если я уже вошел в систему и попал в окно входа в систему, nav.setRoot(TabsPage) выполняется отлично.

Но если я войду в систему через facebook после того, как получу пользователя probile nav.setRoot(TabsPage) , ничего не произойдет. Более того, nav.push(TabsPage) также ничего не делает, но если я делаю nav.push(Main) , где Main является одной из моих вкладок, выполняется правильно, но у меня нет панели вкладок, и, очевидно, появляется кнопка «Назад».

Также, если я делаю nav.setRoot(Main) , он работает правильно, но я попадаю на вкладку без панели вкладок и с кнопкой «Назад».

Добавлю немного информации. Я видел в документах, что setRoot возвращает обещание, поэтому я сделал это:

this.nav.setRoot(TabsPage)
  .then(data => {
      console.log(data);
  }, (error) => {
      console.log(error);
  })

Это выдает true , когда я попадаю на страницу входа в систему, и я уже вошел в систему, но ничего не выдает, когда я вхожу в систему через facebook, поэтому кажется, что обещание никогда не выполняется.

Хорошо, еще одно обновление. Если вы перейдете к ядру Ionic2 в component/nav/nav-controller.js в функции setPages, которая вызывается из setRoot, обратный вызов перехода никогда не будет выполнен.
Если вы следуете последовательности вызываемых функций: setRoot -> setPages -> _transition -> _render -> _postRender

В функции _render:

this.loadPage(enteringView, null, opts, function () {
    if (enteringView.onReady) {
        // this entering view needs to wait for it to be ready
        // this is used by Tabs to wait for the first page of
        // the first selected tab to be loaded
        enteringView.onReady(function () {
            enteringView.loaded();
            _this._postRender(transId, enteringView, leavingView, isAlreadyTransitioning, opts, done);
        });
    }
    else {
        enteringView.loaded();
        _this._postRender(transId, enteringView, leavingView, isAlreadyTransitioning, opts, done);
    }
});

Мой код входит в enteringView.onReady , и обратный вызов никогда не выполняется.

Если я просто вызову метод _postRender перед ожиданием enteringView.onReady , мое приложение работает нормально, но оно такое грязное.
Проблема похоже в ожидании готовности страницы вкладки. Я думаю, что он никогда не будет готов или никогда не достигнет состояния готовности.

Может быть это что-то с моим кодом? Или скорее всего баг?

Спасибо!

У меня такая же проблема с авторизацией Google или Facebook

@privetr , кажется, это было исправлено в бета-версии 4. Не могли бы вы проверить? Мой сейчас работает нормально.

@jorchg Можешь тоже проверить? когда будет возможность :)

Привет всем! Поскольку похоже, что это было исправлено в бета-версии 4, я закрою эту проблему, но если у вас все еще есть эта проблема, не стесняйтесь комментировать!

У меня все еще есть эта проблема. Я не могу заставить навигацию нажать или установить Root на мою TabsPage после обещания входа в Facebook.

Cordova CLI: 6.1.1
Gulp version:  CLI version 1.2.1
Gulp local:   Local version 3.9.1
Ionic Framework Version: 2.0.0-beta.4
Ionic CLI Version: 2.0.0-beta.24
Ionic App Lib Version: 2.0.0-beta.14
ios-deploy version: 1.8.5
ios-sim version: 5.0.8
OS: Mac OS X El Capitan
Node Version: v5.9.1
Xcode version: Xcode 7.3 Build version 7D175

Я также сталкиваюсь с ситуацией, когда, если я вызываю nav.setRoot(x), новая страница фактически не появляется. Тем не менее, если я фокусирую поле ввода на текущей странице, оно исчезает и показывает правильную страницу.

Кроме того, если я нажму на стек вместо setRoot, анимация не произойдет, пока я не сфокусирую поле ввода.

Та же проблема.

Редактировать: просто заменил навигацию в моем приложении на боковое меню, и все работает нормально. Таким образом, вкладки не работают с бета-версии 4 FYI.

@daveshirman ты используешь вкладки для навигации? Это может быть связано с вкладками, моя проблема была связана с боковым меню. Однако они оба используют navcontroller, не уверен, почему это сработает для меня, а не для вас. Возможно, создайте планкер или откройте новую проблему, и команда ionic сможет помочь.

У меня была та же проблема: nav.setRoot(MyComponent) ничего не делал. Я запускал приложение в Android, используя --live-reload , и были предупреждения о том, что некоторые события не запускаются:

0     195445   log      deviceready has not fired after 5 seconds.
1     195457   log      Channel not fired: onDOMContentLoaded

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

Итак, я, наконец, попытался запустить свой код в Android, но без перезагрузки в реальном времени, и он отлично работает.

Итак, в режиме живой перезагрузки есть что-то, что мешает ему работать. Использование Beta4 в качестве моей зависимости и CLI версии 2.0.0-beta25.

Я все еще испытываю проблему, которую я описал. Я совсем забыл, и после обновления ionic он перестал работать, поэтому я просто изменил его снова, как описано в моем последнем посте в этой теме.

Должен ли я открыть еще один вопрос?

Всем привет. Кто-нибудь нашел исправление для этого? В настоящее время я использую Ionic [email protected], и проблема все еще присутствует!

Я обнаружил, что причиной моей проблемы был вызов .pop(), когда был вызван только setRoot.

Я обнаружил, что вызов его из моего app.ts работает надежно. Вызов с любой другой страницы кажется неудачным.
Кроме того, если я не нахожусь на корневой странице, например, на глубине 3 страниц, я также вызываю nav.popToRoot() после метода setRoot, который работает:

this.nav.setRoot(xxxx).then(() =>{
    this.nav.popToRoot();
    //....
});

Почему этот вопрос закрыт? Навигация кажется действительно сломанной. Если я нажму страницу с формами, она тоже не сработает.

Также ломается, когда отображается модальное окно.
13 июля 2016 г., 3:59, «scorpnode» [email protected] написал:

Почему этот вопрос закрыт? Навигация кажется действительно сломанной. Если я нажимаю страницу
с формами в нем это тоже не сработает.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/driftyco/ionic/issues/5883#issuecomment-232241198 ,
или заглушить тему
https://github.com/notifications/unsubscribe/ANnlXmqTT5pf0i-JZNog5F32j8pB785Qks5qVFSZgaJpZM4H0Jz0
.

Привет, это все еще происходит со мной в 2.0.0-beta.10. Я получаю пустой экран после вызова NavController.setRoot. Встречается только на устройствах iOS

информация об устройстве:

  • модель: iPad5,4
  • iOS-версия: 8.3

Я столкнулся с этой проблемой в версии 2.0.0-beta.10 . Я не могу перейти на следующую страницу с помощью NavController.setRoot. Мой код выглядит так:

this.nav.setRoot(somepage).then(() =>{
     this.nav.popToRoot();
});

информация об устройстве:

  • модель: моторала х плей
  • версия андроида: 6

Интерфейс командной строки v2.0.0-бета.32.

Все еще есть проблемы с
this.nav.setRoot(ListPage)
из hello-ionic.ts из начального учебного приложения.

Я хотел попробовать войти в FB, что стало проще с v2.

Кто-то еще?

[Редактировать]
я использовал
import {Nav} from 'ionic-angular';
вместо
import {NavController} from 'ionic-angular ';

Решил мою проблему. Надеюсь, это поможет любому

Здесь такая же проблема!
Есть ли какое-то исправление на данный момент?

Привет всем, если бы кто-то мог предоставить плунжер, демонстрирующий эту проблему, это было бы здорово. Спасибо за использование Ionic!

Привет всем! Поскольку, похоже, прошло некоторое время с тех пор, как по этому вопросу не было никакой активности, я сейчас его закрою. Не стесняйтесь комментировать, если вы все еще сталкиваетесь с этой проблемой. Спасибо за использование Ionic!

Извините, что не ответила, была в отпуске 💃

Моя проблема, кажется, была связана с cordova-plugin-facebook4 https://github.com/jeduan/cordova-plugin-facebook4

Когда я обновил свой проект до beta.10 и начал использовать оболочку Facebook из ionic-native, проблема просто прекратилась. Очень странно, учитывая, что обёртка использует один и тот же плагин.

Большое тебе спасибо!

Нет проблем, рад, что это исправлено для вас!

Привет , @jgw96 ! К сожалению, это все еще кажется мне проблемой в бета-версии 10. Вы можете увидеть это в plnkr ниже. По сути, у меня есть модальный вход, который устанавливает корень на страницу «Вкладки» после успешного входа в систему. На странице «Вкладки» у меня есть кнопка «Выход», которая запускает событие, которое потребляется в app.ts. В app.ts я пытаюсь установить корень на «LoginPage», но ничего не происходит. Глядя на DOM, нажимая «выход», я вижу, что что-то срабатывает, и страница входа существует под вкладками, но навигация просто не происходит. Любые идеи?

http://plnkr.co/edit/n6jCzspnEcjQbl9KF10F

Спасибо за ваше время!

Я подал новую проблему для этого # 7593. Применимо к 2.0.0-beta.10 и 11, возможно другим.

У меня такая же проблема с бета 11.
Навигация работает хорошо, пока не вызывается this.nav.setRoot(xxx). После этого навигация работает случайным образом... При нажатии на новую страницу иногда ничего не происходит: вид остается на текущей странице, а не на новой. При всплывании навигация в других случаях кажется всплывающей дважды.
С объектом NavController вроде бы все в порядке и все нормально срабатывает. Но, кажется, в DOM есть путаница: значения свойств z-index для тегов ion-page в этих случаях неверны, поэтому неправильная страница остается выше.

Я вижу точно такое же поведение, как и @Troknus , в отношении появления двойных страниц и путаницы с DOM.

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

У меня тоже проблема с @Troknus. Я пытаюсь добавить класс show-page вручную и функцию, но это не очень хорошее решение.

Я ищу на всех сайтах, но ничего. Я пробую все возможные решения, но все напрасно.

в бета 10. Навигация работает отлично. Почему не в бета 11.

Я тоже вижу то же поведение, что и @Troknus .

Ребята, у меня та же проблема, что и у @jorchg .. учитывая ошибку вкладок.. он просто нажимает на вкладки после второго вызова (кажется, что толчок происходит, но текущая страница все еще сверху)

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

У меня та же проблема, что и у @Troknus

@schaergeek обновился до бета-версии 11, и это сработало .. вот пример https://github.com/mariohmol/ionic2-meteor-messenger-password

Я поставил большой палец вверх на Трокнусе, но я думаю, что пост более понятен.

Эта навигация - настоящая проблема.
Нам (и, я полагаю, многим другим людям) не разрешено работать с этой ошибкой.
(Мы работаем над бета-версией 11 под именем Troknus, и у нас то же самое...).

Я взглянул на plnkr от @joshgarwood. Публикация событий кажется проблемой? Если вместо того, чтобы публиковать событие аутентификации, чтобы MyApp выполнял работу, вы вместо этого устанавливаете корень через экземпляр NavController в TabPage, тогда это работает. Попытка установить корень через прослушиватель событий в MyApp не работает. Итак, мне кажется, проблема с различными экземплярами NavController, которые вводятся...? Я не уверен, как здесь должен работать DI, но я чувствую, что потребителю не нужно заботиться о том, какой экземпляр NavController вводится. Если я вызову setRoot(*), все должно работать, верно?

Что касается проблемы с Z-индексом, о которой говорит @Troknus , вас всех может заинтересовать проблема № 8042. Хотя в этом случае setRoot(*) вообще не вызывается.

На самом деле, я только что прочитал комментарий @jgw96 , и кажется, что вы не должны использовать случайные экземпляры NavController...?

Тем не менее, это не меняет того факта, что есть ошибка с Z-индексами.

такая же проблема с beta11...

У кого-нибудь есть другой plnkr, который будет воспроизводить путаницу DOM или мерцание страниц? plnkr от @joshgarwood не включает в себя толчки или щелчки.

У @rcjsuen была такая же проблема в Beta10 и Beta11, я нашел этот обходной путь. Не уверен, что setRoot работает должным образом, но пока это работает.

Не работает

  private initializeApp(): void {
    this.platform.ready().then(() => {

      firebase.auth().onAuthStateChanged(user => {
        if (user) {
          this.nav.setRoot(TabsPage);
        } else {
          this.nav.setRoot(LoginPage);
        }
      });

      StatusBar.styleDefault();
    });
  }
}

Работающий

 private initializeApp(): void {
    this.platform.ready().then(() => {

      firebase.auth().onAuthStateChanged(user => {
        if (user) {
          this.setRoot(TabsPage);
        } else {
          this.setRoot(LoginPage);
        }
      });

      StatusBar.styleDefault();
    });
  }

  private setRoot(newRootPage: any){
    this.rootPage = newRootPage;
  }
}

@Vanclief У меня такая же проблема, но даже это решение, которое вы предложили, мне не помогло.
Мой код с самого начала был таким же, как у вас - затем я попытался перейти на ionic 2 rc0 и angular 2.0.1, но это не сработало ни с firebase (ни с angularfire), поэтому я вернулся к:

{
    "@angular/common": "2.0.0-rc.4",
    "@angular/compiler": "2.0.0-rc.4",
    "@angular/core": "2.0.0-rc.4",
    "@angular/forms": "^0.2.0",
    "@angular/http": "2.0.0-rc.4",
    "@angular/platform-browser": "2.0.0-rc.4",
    "@angular/platform-browser-dynamic": "2.0.0-rc.4",
    "@angular/router": "^2.0.0-rc.2",
    "firebase": "^3.3.0",
    "ionic-angular": "2.0.0-beta.11",
    "ionic-native": "1.2.2"
}

удалил node_modules/, установил npm, и теперь я столкнулся с этой проблемой.

Странно то, что если я устанавливаю для this.rootPage что-то вне функции обратного вызова, то приложение переходит на эту страницу. Например

        this.setRoot(TeamPage);

        firebase.initializeApp(this.firebaseConfig);
        firebase.auth().onAuthStateChanged(user => {
            if (user) {
                this.setRoot(TeamPage); // If there's a user take him to the Teams page.
            } else {
                this.setRoot(LoginPage);  // If there's no user logged in send him to the LoginPage
            }
        });

Переместит пользователя на TeamPage, а затем направит пользователя на LoginPage (в случаях, когда пользователь не вошел в систему)

тем не мение

        firebase.initializeApp(this.firebaseConfig);
        firebase.auth().onAuthStateChanged(user => {
            if (user) {
                this.setRoot(TeamPage); // If there's a user take him to the Teams page.
            } else {
                this.setRoot(LoginPage);  // If there's no user logged in send him to the LoginPage
            }
        });

Никогда не будет перемещать пользователя куда-либо

@ Питер-Пайпер

Я не обновлял, но у меня были некоторые проблемы, которые исчезли после обновления до RC0. Для одного из моих проектов я также использую firebase, и у меня были проблемы с обновлением, но теперь все работает.

Я не использую AngularFire, но это руководство описывает его: https://playcode.org/getting-started-with-ionic-2-rc0-firebase-3-angularfire-2/

РЕДАКТИРОВАТЬ: Вот быстрый пример, который я сделал

@Ванклиф

Спасибо, я уже пробовал этот подход - и он сработал. Но тот факт, что мне приходится делать хаки в модуле узла в сочетании с крахом ionic RC_0 при просмотре файлов при выполнении ionic serve , заставил меня прервать обновление и придерживаться более старой версии.

В любом случае, я решил проблему, упомянутую выше, когда установка корневой страницы в обратном вызове никогда не работает, если она не была установлена ​​​​ранее, проверив, установлен ли firbase.auth.currentUser, а затем установив rootPage

        const page = firebase.auth().currentUser ? TeamPage : LoginPage;
        this.setRoot(page);

        firebase.auth().onAuthStateChanged(user => {
            // If there's a user take him to the Teams page otherwise send him to LoginPage
            const page = user ? TeamPage : LoginPage;
            this.setRoot(page);
        });

а затем выполнить проверку в методе setRoot, чтобы он не переходил на одну и ту же страницу дважды.

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

Это все еще проблема. Использование this.nav.push(...) работает нормально, но использование this.nav.setRoot(...) не работает после первого раза. Вот моя ионная информация:

Your system information:

Cordova CLI: 6.3.1
Gulp version:  CLI version 3.9.1
Gulp local:  
Ionic Framework Version: 2.0.0-rc.0
Ionic CLI Version: 2.1.0
Ionic App Lib Version: 2.1.0-beta.1
OS: Distributor ID: Ubuntu Description: Ubuntu 16.04.1 LTS 
Node Version: v4.6.0

Из package.json

  "dependencies": {
    "@ionic/storage": "^1.0.3",
    "firebase": "^3.4.1",
    "ionic-angular": "^2.0.0-rc.0",
    "ionic-native": "^2.2.2",
    "ionicons": "^3.0.0"
  },

@jgw96 jgw96 Почему это закрыто? Очевидно, что это открытый случай, поскольку setRoot не работает должным образом.

@daveshirman , я столкнулся с той же проблемой, это не проблема навигации, но вот как я ее решил.

в моем app.ts есть это

firebase.initializeApp (конфигурация);

platform.ready().then(() => {
  firebase.auth().onAuthStateChanged((user) => {
    if (user) {
      // If there's a user take him to the TabsPage page.
      this.rootPage = TabsPage;
    } else {
      // If there's no user logged in send him to the LoginPage
      this.rootPage = LoginPage;
    }
  });
  // Okay, so the platform is ready and our plugins are available.
  // Here you can do any higher level native things you might need.
  StatusBar.styleDefault();
});

приведенный выше оператор if говорит: // Если есть пользователь, УСТАНОВИТЕ КОРНЕВУЮ ПРАЖУ НА страницу TabsPage.
а в противном случае он должен оставаться на странице входа в систему, вы заметите, что если вы используете обычный метод входа в систему firebase, часть if будет выполняться (т. е. она перейдет на корневую страницу, но при использовании Facebook часть else будет выполняться (т. Страница авторизации

Я решил это так.
Логин в фейсбук() {

// авторизуемся в фейсбуке
Facebook.login(['email']).then((result=>{
// устанавливаем учетные данные, вы будете использовать их для входа в firebase
пусть учетные данные = firebase.auth.FacebookAuthProvider 'учетные данные'
// войдите в firebase, это то, что мешает работе навигации, что приводит к ELSE пути оператора // в app.ts для выполнения
вернуть firebase.auth().signInWithCredential(учетные данные);
})).then((пользователь)=>{
//оповещение(firebase.auth().currentUser.uid);
this.userProfileRef.child(firebase.auth().currentUser.uid).set({
идентификатор:firebase.auth().currentUser.uid,
электронная почта: user.email,
отображаемое имя: user. отображаемое имя,
profilePictureURL:user.photoURL
});

   this.navCtrl.setRoot(TabsPage);
}).catch((error)=>{
  alert(error);
})

}

что произошло в приведенном выше коде, так это то,
Во-первых, вам нужно войти в Facebook, что я и сделал.
Facebook.login(['email']).then((result=>

2-й вам нужно установить учетные данные, которые помогут вам войти в firebase, используя accessToken, отправленный вам результатом входа в Facebook, что я и сделал здесь
пусть учетные данные = firebase.auth.FacebookAuthProvider 'учетные данные' ;
3-й вам нужно войти в firebase с установленными вами учетными данными, что я и сделал здесь
вернуть firebase.auth().signInWithCredential(учетные данные);
ПРИМЕЧАНИЕ. Это точная причина, по которой ваш this.navCtrl.setRoot(TabsPage); не сработало (поскольку пользователь еще не вошел в систему на firebase.

так что теперь вы можете перейти к rootPath по пути then() кода.

и, пожалуйста, убедитесь, что ваш appId facebook и appSecrete настроены на панели firebase> аутентификация> facebook.

НАДЕЮСЬ НА ЭТУ ПОМОЩЬ

@OyebisiJemil Спасибо за ваше длинное объяснение того, что вы сделали. Но я имел в виду, что концептуально у меня была та же проблема, поскольку setRoot не работает должным образом, а не с использованием facebook или чего-то еще. Спасибо еще раз, хотя. Этот вопрос не должен быть закрыт, если нет другого открытого с таким же описанием.

Что, видимо, есть:

https://github.com/driftyco/ionic/issues/8453

Я также сталкиваюсь с этой проблемой с очень похожими обстоятельствами. В моем случае переключение на push(view) вместо setRoot(view) решило проблему и на самом деле не связано с потоком моего приложения.

У меня такая же проблема. nav.push(view) работает нормально, но nav.setRoot не работает. У кого-нибудь есть предложения?

Я все еще сталкиваюсь с той же проблемой, что и сегодня в последней сборке:

выйти() {
this.authData.logoutUser().then(() => {
this.nav.setRoot(Страница входа);
});
}

не работает. Пожалуйста, помогите. Спасибо. Лис

Используйте push вместо setRoot...

@ jgw96 , @adamdbradley , это все еще серьезная проблема. Пожалуйста, снова откройте его и назначьте веху. У многих людей есть эта проблема, в том числе у меня, и это важная функциональность для приложения.

@dejancencelj это не решение этой проблемы.

@lisaiceland , чтобы обойти эту проблему, я последовал этому предложению:
https://forum.ionicframework.com/t/cant-access-rootnav-after-upgrade-to-beta-11/59889/15?u=niallr

@ niallr12 @ daveshirman это все еще проблема в RC3?

@manucorporat Я не уверен, что это проблема в RC3, но я не вижу исправления в журнале изменений. Я доволен своим решением и чувствую, что в любом случае это лучший подход.

Я могу проверить для вас в RC3, если хотите.

@ niallr12 ну, я так и не смог воспроизвести эту конкретную проблему. Но я потратил недели на укрепление NavController с кучей мелких исправлений и тестов. Как этот: наихудший случай , который нагружает стек навигации сумасшедшим потоком.

Я был бы очень полезен, если бы вы могли проверить эту ошибку на RC3.

@manucorporat Я все еще могу воспроизвести проблему в rc3. В моем конкретном случае, похоже, не отклоняется текущий вид, когда я устанавливаю root. Если я отклоняю текущий вид, а затем устанавливаю root, он работает нормально. Нажатие представления работает совершенно нормально.

Привет,

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

Страница приветствия (корневая страница)

gotoFeature(): void {
  this.navCtrl.push(feature);
}

Страница функций ( с вкладками )

logout(): void {
  this.navCtrl.parent.parent.pop() //  back to welcome
}

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

Почему этот вопрос закрыт? У меня такая же проблема. Я использую функцию setRoot в своем примере поставщика. Приложение setRoot и измененная страница, но после завершения навигация (меню) отключена.

Это мой код в провайдере

private _leaveGroup(user: modelUser, room: modelRoom): Promise<any> {
    return new Promise((resolve, reject) => {
      let loading = this.loadingCtrl.create({dismissOnPageChange: false});
      loading.present();

      this.ref.child(room.id).child('users').child(user.id).remove()
        .then(() => this.navCtrl.setRoot(PageDashboard))
        .then(() => loading.dismiss())
        .then(() => resolve())
        .catch(err => loading.dismiss().then(() => reject(err)));
    });
}

это моя информация

Интерфейс командной строки Кордовы: 6.3.1
Версия Ionic Framework: 2.0.0-rc.3
Ионная версия интерфейса командной строки: 2.1.4
Ionic App Lib Версия: 2.1.2
Ионные сценарии приложений Версия: 0.0.45
версия ios-развертывания: 1.9.0
iOS-SIM версия: 5.0.9
ОС: Mac OS X Сьерра
Версия узла: v6.9.1
Версия Xcode: версия сборки Xcode 8.1 8B62

У меня была такая же проблема. Однако после того, как я убедился, что в любой момент времени выполняется только оператор setrroot, все работает отлично. Но по разным причинам, если несколько операторов setroot выполняются в любой момент времени, то есть перед рендерингом, Ionic создает несколько страниц, на которые в моем случае зависает навигация.

Кажется, эта проблема превратилась в нечто более странное в RC4. Тот же тип проблемы, за исключением того, что при установке root сейчас с приведенной в качестве примера страницы входа в меню/панель управления страница входа остается в стеке представлений, который отображает кнопку «Назад» в заголовке, вызывая все виды хаоса.

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

Я создаю событие для выхода из системы.

// app.component.ts
events.subscribe('logout', () => {
  localStorage.removeItem('token');
  this.rootPage = LoginPage;
 });

теперь выход:

// pages/home/home.ts
  logout() {
    this.events.publish('logout');
  }

Всем привет. Кто-нибудь нашел исправление для этого? В настоящее время я использую Ionic 2.0.0-rc.4, и проблема все еще присутствует!

Привет,

// импортируем эти классы
 импортировать {Component, ViewChild} из '@angular/core';
 импортировать { Platform, MenuController, Nav } из 'ionic-angular';

 класс экспорта MyApp {
 //Установить это свойство
 @ViewChild(Nav) навигация: навигация;

 // реализуем этот метод и отлично работает
 частная openPage (страница: любая): любая {
 //проверяем токен 
 this.loggedIn = this.service.canActivate();
 если (!this.loggedIn) {
 // не зарегистрирован 
 this.nav.setRoot(Страница входа);
 } еще {
 //зарегистрировано
 this.nav.setRoot(Домашняя страница);
 }
 это.менюCtrl.close();
 }

Обнимаю!

Мое приложение: https://github.com/siteslave/chiangmai-demo-app/blob/master/src/pages/main/main.ts#L96 -L100

import {
  ...
  App,
  ...
} from 'ionic-angular';

//=====================//
 logout() {
    localStorage.removeItem('token');
    let nav = this.app.getRootNav(); 
    nav.setRoot(LoginPage);
  }

Кто-нибудь нашел хотя бы обходной путь к этому?

Та же проблема, что и у @joshuaohana.

Если я делаю setRoot ПЕРЕД входом в facebook, все работает как положено.
Если я сделаю setRoot ПОСЛЕ facebook, я получу то же поведение, что и @joshuaohana.

Спасибо.

(Только что нашел этот дубликат: https://github.com/driftyco/ionic/issues/6297)

создать событие для выхода из системы.

также найдите ниже подробное объяснение навигации с другим рабочим решением.

https://webcake.co/exploring-nav-hierarchy-in-the-ionic-2-tabs-page/

самая ценная часть кода вставлена ​​ниже.

импортировать {App} из 'ionic-angular';
...
конструктор (частное _app: приложение) {}

выйти() {
...

    // Now I'll access the root NavController for the app,
    // and use that to reset the nav stack

    const root = this._app.getRootNav();
    root.popToRoot();

    // since I only have two items in the root NavController,
    // I could also have run root.pop() instead

}
...

Возможно, кто-то из вас сделал ту же ошибку, что и я:

Я использовал навигацию через «setRoot», но пропустил, что в то же время привязка «[root]=..» все еще доступна в шаблоне HTML. Синхронизация двух данных снова устранила мою проблему. В этом случае я удалил привязку модели и управлял корнем только через API.

С уважением, Майкл

Привет, ребята,

Решение @ly-dev сработало для меня. Я только что сделал this._app.getRootNav().setRoot(EntryPage); , и это работает.

Во-первых, импортируйте Nav из ionic-angular, там же, где и navController.
import { App, NavController } from 'ionic-angular';

затем предоставьте его в своем конструкторе:
constructor(public navCtrl: NavController, public appCtrl: App)

теперь вы можете получить доступ к rootnav:
this.appCtrl.getRootNav().setRoot(YourComponent);

@AmitPoojary Это решение не сработало. Когда пользователь переходит на несколько вкладок.

Пример : вкладка «Главная» с несколькими страницами. Когда пользователь переходит на несколько страниц. Затем не возвращается, а переключается на вкладку «Учетная запись», а затем выходит из системы и остается на вкладке «Учетная запись» до обновления.

Я выяснил, что если пользователь нажмет на вкладку «Главная» и не пойдет дальше, он правильно выйдет из системы.

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

Это все еще проблема.

Да, для меня все еще проблема, так как я использую Tab в качестве основной целевой страницы приложения. При вызове _navCtrl.setRoot() с любой страницы внутри tabComponent только эта страница устанавливается в rootPage, но интерфейс вкладки внизу остается на месте. Это позволяет мне по-прежнему получать доступ к другим страницам на вкладке!

image

Правильное решение этого:

let _nav = this.app.getRootNav(); _nav.setRoot(LoginPage);

или одна строка

this.app.getRootNav().setRoot(LoginPage);

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

да. Я также сделал то же самое с:

this.app.getRootNav().setRoot(SetupPage);

Однако он разбивает пути изображений на устройствах...

(getRootNav) устарел и будет удален в следующем основном выпуске. Вместо этого используйте getRootNavById.

Итак... эта ошибка так и не была исправлена, и предыдущий патч больше не работает.. :/

this.app.getRootNav().setRoot(LoginPage);

Это не для меня...

это было решено с выпуском 3.5.3 для меня по крайней мере

упс, 3.5.3 мне это не исправила.

ребята, и у меня все еще есть эта проблема, боковая панель не работает после setRoot();

я использую только это: this.navCtrl.setRoot(HomePage);

Я пробовал все решения здесь, но все еще имею эту проблему
Ионный 3.10.3

я так решил

импортировать приложение

импортировать {IonicPage, NavController, Nav, App} из 'ionic-angular';

И теперь используйте

const root = this.app.getRootNav();
root.popToRoot();
root.setRoot("LoginPage");

Здравствуйте, я тестирую приложение Hello World на iPhone4 и некоторых других устройствах с Android.

Последняя версия Ionic и CLI.

Основная огромная проблема с айфоном, не работает вызов setRoot.

недействительным onGoClick () {
// эта строка НИЧЕГО НЕ ДЕЛАЕТ, и ошибка не возникает.
this.navCtrl.setRoot(Домашняя страница);

// эта строка НИЧЕГО НЕ ДЕЛАЕТ, и ошибка не возникает.
this.app.getRootNav().setRoot(HomePage);
}

это тоже НЕ РАБОТАЕТ

var root = this.appCtrl.getRootNav();
root.setRoot(Домашняя страница);
корень.popToRoot();

С уважением.

Привет @alemdg Я думаю, что это способ, которым вы вызываете маршруты, например, если вы определяете как текст или как объект, что угодно,

если вы хотите избежать проблем, вызовите как текст ("HomePage") и создайте эту переменную

const root = this.app.getRootNav();

и вызовите следующий метод

const root = this.app.getRootNav();
корень.popToRoot();
root.setRoot("Домашняя страница");

импортировать этот объект

import {IonicPage, NavController, NavParams, Nav, App} из 'ionic-angular';

конструктор(
общедоступное приложение: приложение
) {

во-первых, это popToRoot, а во-вторых, определение нового корня;)

недействительным onGoClick () {
// эта строка НИЧЕГО НЕ ДЕЛАЕТ, и ошибка не возникает.
this.navCtrl.setRoot ("Домашняя страница");

// эта строка НИЧЕГО НЕ ДЕЛАЕТ, и ошибка не возникает.
корень.popToRoot();
root.setRoot ("Домашняя страница");
}

это тоже НЕ РАБОТАЕТ

const root = this.appCtrl.getRootNav();
корень.popToRoot();
root.setRoot ("Домашняя страница");

@spidermay Спасибо за ответ, но все еще не работает.

я импортировал
import {IonicPage, NavController, NavParams, Nav, App} из 'ionic-angular';

и казнен
const root = this.app.getRootNav();
корень.popToRoot();
root.setRoot("Домашняя страница");

но если я нажму кнопку дважды, это сработает....

как будто какого-то обновления не хватает....

Я вижу это на 3.7.1.

Используйте следующий код, он должен работать или дать вам сообщение об ошибке

это.меню.закрыть();
this.nav.setRoot(HomePage).then(()=>{
this.nav.popToRoot();
}).поймать(ошибка=>{
оповещение (ошибка.toString());
});

Привет @FatehiAlqadasi , спасибо.
Вылетает ошибка, вот лог.

ошибка:
C@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21236
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21702
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21967
уменьшить@[собственный код]
O@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21927
format@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:8:12952
transform@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:8:14339
Ce@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:3:23348
Т.е.@файл :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:1046
Te@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:518
no@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:5140
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:42:25653
updateRenderer@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:4409
Se@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:328
Мы@файл :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:3041
Ge@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:2439
Se@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:336
detectChanges@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:6:5799
_viewAttachToDOM@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:17:22059
_transition@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:17:23173
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:17:19213
invoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9288
onInvoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:5:1143
invoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9231
run@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:4458
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:14079
invokeTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9972
onInvokeTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:5:1047
invokeTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9900
runTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:5153
o@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:2210
invoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:10986
ошибка:
C@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21236
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21702
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21967
уменьшить@[собственный код]
O@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21927
format@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:8:12952
transform@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:8:14339
Ce@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:3:23348
Т.е.@файл :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:1046
Te@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:518
no@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:5140
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:42:25653
updateRenderer@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:4409
Se@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:328
Мы@файл :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:3041
Ge@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:2439
Se@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:4:336
detectChanges@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:6:5799
_viewAttachToDOM@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:17:22059
_transition@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:17:23173
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:17:19213
invoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9288
onInvoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:5:1143
invoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9231
run@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:4458
файл:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:14079
invokeTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9972
onInvokeTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:5:1047
invokeTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:9900
runTask@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:5153
o@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:2210
invoke@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/polyfills.js:3:10986
dispatchEvent@[собственный код]
handleTapPolyfill@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:18:6423
pointerEnd@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:18:5144
[собственный код]
handleTouchEnd@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:19:19943
[собственный код]

@tonyawad88
Это устранило проблему

logout(){
this.navCtrl.setRoot("LoginPage");
this.navCtrl.push("LoginPage");

}

Ошибка двухлетней давности, до сих пор никто не решается ее исправить... У меня такая же проблема в Ionic 3.

Привет всем,

Я могу получить все свои данные с корневой страницы, а также перемещаться, но не могу перемещаться по странице вне вкладок, она открыта как дочерняя часть вкладок.

Перепробовал все возможности, чтобы решить эту проблему, но никакая операция не работает.

Вкладка, где мои данные.
1st

После нажатия на извлеченные данные он будет перенаправлен на страницу сведений о данных, он был перенаправлен, но внутри вкладки. нравится...

2nd

выручи меня,

Заранее спасибо.

Я заметил эту ошибку с [email protected]. Кажется, это связано с DeepLinkConfig, потому что, если я удалю это из моего app.module, я могу без проблем вызывать nav.setRoot() в течение всего дня. Моя гипотеза состоит в том, что после последующих вызовов setRoot() логика диплинка переходит в состояние, когда стек навигации изменяется до window.location, код диплинка видит, что window.location указывает на страницу, которой нет на странице. stack (потому что вы setRoot() удалили его), и поэтому он возвращает вас на страницу, с которой вы только что пытались уйти.

В любом случае, вот обходной путь, который работает для меня.

await this.nav.push(page, params);
this.nav.remove(0, this.nav.length() - 1);

Большое спасибо @jknisley ,
Я решил свою проблему с этим.

detailEvent(eventItem) {
    this.app.getRootNav().push(DetailEventsPage, { itemUp: eventItem });  
  }

Этот код перенаправит меня на новую страницу и другой макет (не на вкладку).

Просто оставлю это здесь для потомков. Эта функция выхода, кажется, работает для меня без каких-либо побочных эффектов. Спасибо @uiktiomasfeliz.

cli-пакеты: (/usr/local/lib/node_modules)

@ionic/cli-utils  : 1.19.2
ionic (Ionic CLI) : 3.20.0

глобальные пакеты:

cordova (Cordova CLI) : 7.1.0

локальные пакеты:

@ionic/app-scripts : 3.1.2
Cordova Platforms  : android 6.3.0 ios 4.5.4
Ionic Framework    : ionic-angular 3.9.2

Система:

ios-deploy : 1.9.2
Node       : v8.9.1
npm        : 5.7.1
OS         : macOS High Sierra
Xcode      : Xcode 9.3 Build version 9E145
async logOut() {
    await this.authProvider.logout();
    await this.app.getRootNav().setRoot('LoginPage');
  }

Я нашел способ установить новый стек навигации и удалить старый стек навигации. Это было сделано для ion-angular 3.9.2

this.navCtrl.remove(0, this.navCtrl.length() - 1);
this.navCtrl.insert(0, MainPage);
this.navCtrl.pop();

Спасибо за проблему! Эта проблема заблокирована, чтобы предотвратить комментарии, не относящиеся к исходной проблеме. Если это все еще проблема с последней версией Ionic, создайте новую проблему и убедитесь, что шаблон полностью заполнен.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

vswarte picture vswarte  ·  3Комментарии

giammaleoni picture giammaleoni  ·  3Комментарии

alan-agius4 picture alan-agius4  ·  3Комментарии

gio82 picture gio82  ·  3Комментарии

MrBokeh picture MrBokeh  ·  3Комментарии