Ionic-framework: Ionic2 - nav.setRoot(Component) - 仅第一次工作,之后无法导航,没有错误报告

创建于 2016-03-18  ·  100评论  ·  资料来源: ionic-team/ionic-framework

问题的简短描述:

我正在用 Ionic2 开发一个应用程序。 我有 App.ts 作为父页面,Welcome.ts 作为子页面,Featured.ts 作为子页面。 我已将 Firebase 与该应用程序集成。 Rootpage 首先设置为 Welcome。

this.rootPage = Welcome;

第 1 步:我单击 Welcome to authenicate with Google 上的按钮,一旦调用 onAuth,我设置this.nav.setRoot(Featured);到目前为止一切正常。 我进入了特色页面,该页面启用了具有不同页面的侧边菜单,并且我能够导航到所有这些页面没有问题。

第 2 步:Featured 启用 App.ts/html 的侧边菜单,在那里我有一个注销按钮,调用 unauth。
Unauth 做了一些 Firebase unauth 然后:

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

步骤3:再次登录与步骤1相同。到目前为止一切都很好。

第 4 步:打开侧边菜单,从侧边菜单中选择任何页面,导航不会发生。 侧边菜单关闭但页面保持不变,导航栏图标按钮消失并且不发生导航。
打开页面代码:

  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.x

从终端/cmd 提示符运行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 

谢谢你。

reply

最有用的评论

为什么这个问题被关闭了? 导航似乎真的坏了。 如果我推送一个包含表单的页面,它也不会工作。

所有100条评论

我注意到以下几点:dom 中同时存在 2 个离子页面。
screen shot 2016-03-18 at 3 34 03 pm

我导航到的是“探索”,它的 z-index(92) 低于“特色”页面。 因此我应该进行探索,但“特色”覆盖在“探索”之上,z-index 为 93。

我遇到了同样的问题,但就我而言,登录后我什至无法重定向。

如果我已经登录并进入登录视图,则nav.setRoot(TabsPage)将完美执行。

但是,如果我在获得用户身份后使用 facebook 登录nav.setRoot(TabsPage)什么都不做。 此外, nav.push(TabsPage)也没有做任何事情,但是如果我在 Main 是我的选项卡之一的地方执行nav.push(Main) ,则可以正确执行,但是我没有选项卡栏并且显然会出现后退按钮。

此外,如果我执行nav.setRoot(Main)它可以正常工作,但我会进入一个没有标签栏和后退按钮的标签。

我补充一些信息。 我在文档中看到setRoot返回一个承诺,所以我这样做了:

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

当我登陆登录页面并且我已经登录时,这会抛出true ,但是当我使用 facebook 登录时不会抛出任何东西,所以似乎这个承诺永远不会得到解决。

好的,另一个更新。 如果您在从 setRoot 调用的函数 setPages 中转到 Ionic2 的核心组件/导航/导航控制器.js,则永远不会执行转换的回调。
如果您遵循调用的函数流程: 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并且永远不会执行回调。

如果我只是在等待enteringView.onReady之前调用_postRender方法,我的应用程序可以正常工作,但是它太脏了。
问题似乎是等待选项卡的页面准备好。 我认为它永远不会准备好或永远不会获得良好的就绪状态。

这可能是我的代码吗? 或者很可能是一个错误?

谢谢!

我对 Google 或 Facebook 身份验证有同样的问题

@privetr这似乎已经用 beta4 修复了。 你能检查一下吗? 我的现在工作正常。

@jorchg你也可以检查一下吗? 当你有机会时:)

大家好! 看起来这在 beta.4 中已修复,我将关闭此问题,但如果您仍然遇到此问题,请随时发表评论!

我仍然有这个问题。 在 Facebook 登录承诺之后,我无法让导航推送或 setRoot 到我的 TabsPage。

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,则动画不会发生,直到我聚焦一个输入字段。

同样的问题。

编辑:刚刚将我的应用程序中的导航换成侧面菜单,一切正常。 因此,从 beta 4 FYI 开始,这些标签就被破坏了。

@daveshirman您是否使用标签来导航? 它可能与标签有关,我的问题与侧面菜单有关。 但是他们都使用导航控制器,不知道为什么它对我有用而不对你有用..也许会产生一个 plunker 或打开一个新问题,离子团队将能够提供帮助。

我遇到了同样的问题: nav.setRoot(MyComponent)似乎没有做任何事情。 我正在使用--live-reload在 Android 中运行该应用程序,并且有一些关于未触发的事件的警告:

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 [email protected] ,但问题仍然存在!

我发现我的问题的原因是只调用了 setRoot 时调用了 .pop() 。

我发现从我的 app.ts 调用它似乎工作可靠。 从任何其他页面调用它似乎都失败了。
此外,如果我不在根页面上,比如 3 页深,我还会在 setRoot 方法之后调用 nav.popToRoot() ,该方法有效:

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

为什么这个问题被关闭了? 导航似乎真的坏了。 如果我推送一个包含表单的页面,它也不会工作。

当也显示模态窗口时也会中断。
2016 年 7 月 13 日凌晨 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();
});

设备信息:

  • 型号:motorala x play
  • 安卓版本:6

CLI v2.0.0-beta.32。

仍然有问题
this.nav.setRoot(ListPage)
来自入门教程应用程序的 hello-ionic.ts。

我想尝试使用 v2 轻松实现的 FB 登录。

还有谁?

[编辑]
我正在使用
import {Nav} from 'ionic-angular';
代替
import {NavController} from 'ionic-angular ';

解决了我的问题。 希望对任何人都有帮助

这里有同样的问题!
目前有修复吗?

大家好,如果有人可以提供一个演示这个问题的插件,那就太棒了。 感谢您使用离子!

大家好! 似乎已经有一段时间没有关于这个问题的任何活动了,我现在将关闭它。 如果您仍然遇到此问题,请随时发表评论。 感谢您使用离子!

抱歉没有回答,我在假期💃

我的问题似乎与 cordova-plugin-facebook4 https://github.com/jeduan/cordova-plugin-facebook4有关

当我将我的项目更新到 beta.10 并开始使用 ionic-native 的 Facebook 包装器时,问题就停止了。 很奇怪,考虑到包装器使用相同的插件。

非常感谢你!

没问题,很高兴它为您解决了!

@jgw96 ! 不幸的是,在 Beta 10 中这对我来说似乎仍然是一个问题。您可以在下面的 plnkr 中看到这一点。 实际上,我有一个登录模式,一旦成功登录,就会将根设置为“Tabs”页面。从“Tabs”中的一个页面,我有一个“Logout”按钮,它会触发一个在 app.ts 中使用的事件。 在 app.ts 中,我尝试将根设置为“LoginPage”,但似乎没有任何反应。 在单击“注销”的同时查看 DOM 时,我可以看到正在触发的事情,并且登录页面存在于选项卡下方,但似乎没有出现导航。 有任何想法吗?

http://plnkr.co/edit/n6jCzspnEcjQbl9KF10F

谢谢你的时间!

我为此 #7593 提交了一个新问题。 适用于 2.0.0-beta.10 和 11,可能还有其他。

我对 beta 11 也有同样的问题。
在调用 this.nav.setRoot(xxx) 之前,导航似乎运行良好。 之后,导航随机工作......当推送一个新页面时,有时什么也没有发生:视图停留在当前页面而不是新页面上。 弹出时,导航似乎有时会弹出两次。
NavController 对象似乎一切都正确,并且一切正常。 但似乎 DOM 中存在混淆:在这些情况下,ion-page 标签的 z-index 属性值是错误的,因此错误的页面会停留在上面。

关于双页弹出和 DOM 混淆,我看到了与@Troknus完全相同的行为。

同样是第一次setRoot,然后在下一次导航时,初始根页面闪烁,好像之前没有完全卸载。

我也有@Troknus问题我尝试手动添加显示页面类和功能,但不是一个好的解决方案。

我在所有网站上搜索,但什么也没有。 我尝试了所有可能的解决方案,但一切都在风向标。

在 beta 10 中。导航运行完美。 为什么不在 beta 11 中。

我也看到与@Troknus相同的行为。

伙计们,和@jorchg说的有同样的问题.. 考虑到标签错误.. 它只是在第二次调用后推送到标签(似乎推送发生但当前页面仍在顶部)

登录后,如果我尝试推送到选项卡视图但不进行操作..如果我推送到应该在选项卡中的页面..它可以工作..这是项目

我和@Troknus有同样的问题

@schaergeek更新到 beta 11 并且有效.. 这是示例https://github.com/mariohmol/ionic2-meteor-messenger-password

我对 Troknus 竖起了大拇指,但我认为帖子更清楚。

这种导航是一个真正的问题。
我们(我想还有很多其他人)不允许在生产中使用这个错误。
(我们在 beta 11 中作为 Troknus 工作,我们有相同的......)。

我看了@joshgarwood的plnkr。 事件发布似乎是问题? 如果不是发布身份验证事件让 MyApp 完成工作,而是通过 TabPage 中的 NavController 实例设置根,那么它可以工作。 尝试通过 MyApp 中的事件侦听器设置 root 不会。 所以在我看来,注入的不同 NavController 实例似乎存在问题......? 我不确定 DI 应该如何在这里工作,但我觉得消费者不必关心注入了哪个 NavController 实例。 如果我调用 setRoot(*) 那么事情应该可以正常工作,对吧?

关于@Troknus所说的 Z-index 问题,大家可能对 issue #8042 感兴趣。 尽管在那种情况下根本没有调用 setRoot(*) 。

实际上,我刚刚阅读了@jgw96评论,看来您不应该使用随机的 NavController 实例......?

尽管如此,这并不能改变 Z 指数存在错误的事实。

beta11也有同样的问题...

有没有人有不同的 plnkr 可以重现 DOM 变得混乱或页面闪烁? @joshgarwood 的plnkr不包括推送或弹出。

@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/

编辑:这是我做的一个简单的例子

@Vanclief

谢谢,我确实已经尝试过这种方法 - 它确实有效。 但是,在执行ionic serve时,我必须在节点模块中进行 hack 以及 ionic RC_0 崩溃的事实使我中止升级并坚持使用旧版本。

无论如何,我确实解决了上面提到的问题,即在回调中设置根页面永远不会起作用,除非它之前已设置,通过检查是否设置了 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 方法中进行检查,这样它就不会两次导航到同一页面。

这也是一个 hack,并没有解决根本问题。 不幸的是,下周我没有时间深入调查这个问题。

这仍然是一个问题。使用 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为什么关闭? 显然这是一个未解决的案例,因为 setRoot 无法正常工作。

@daveshirman ,我遇到了同样的问题,这不是导航问题,但这是我解决它的方法。

在我的 app.ts 中有这个

firebase.initializeApp(config);

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 语句是说 // 如果有用户 SET THE ROOTPAGE TO TabsPage 页面。
否则它应该保留在 LoginPage 中,您会注意到,如果您使用正常的 firebase 登录方法,if 部分将执行(即它将导航到 rootPage,但是当使用 Facebook 时,else 部分将执行(即它停留在登录页面

我是这样解决的。
Facebook登入() {

//登录脸书
Facebook.login(['email']).then((result=>{
// 设置凭据,您将使用它来登录 Firebase
让凭证 = firebase.auth.FacebookAuthProvider '凭证'
// 登录到 firebase,这是阻止导航工作的原因,导致 app.ts 中 //statement 的 ELSE 路径执行
return firebase.auth().signInWithCredential(credentials);
})).then((用户)=>{
//alert(firebase.auth().currentUser.uid);
this.userProfileRef.child(firebase.auth().currentUser.uid).set({
id:firebase.auth().currentUser.uid,
电子邮件:user.email,
显示名称:用户.显示名称,
profilePictureURL:user.photoURL
});

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

}

上面代码中发生的事情是,
第一个你需要登录facebook,我用
Facebook.login(['email']).then((result=>

第二,您需要设置一个凭据,以帮助您使用 Facebook 登录结果发送给您的 accessToken 登录到 Firebase,这就是我在这里所做的
让凭证 = firebase.auth.FacebookAuthProvider '凭证' ;
第三,您需要使用您设置的凭据登录到 Firebase,这就是我在这里所做的
return firebase.auth().signInWithCredential(credentials);
注意:这就是为什么你的 this.navCtrl.setRoot(TabsPage); 没有工作(因为用户尚未登录 firebase.

因此您现在可以导航到代码 then() 路径的 rootPath。

请确保您的 facebook appId 和 appSecrete 已在 firebase>authentication>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(LoginPage);
});
}

不工作。 请帮忙。 谢谢。 利斯

使用 setRoot 的 push insted ...

@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)));
    });
}

这是我的信息

科尔多瓦 CLI:6.3.1
离子框架版本:2.0.0-rc.3
离子 CLI 版本:2.1.4
离子应用程序库版本:2.1.2
离子应用脚本版本:0.0.45
ios部署版本:1.9.0
ios-sim 版本:5.0.9
操作系统:Mac OS X Sierra
节点版本:v6.9.1
Xcode 版本:Xcode 8.1 Build 版本 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,但问题仍然存在!

你好,

//导入这些类
从'@angular/core'导入{组件,ViewChild};
从“离子角度”导入{平台,菜单控制器,导航};

导出类 MyApp {
 //设置这个属性
 @ViewChild(Nav) 导航:导航;

 //实现这个方法,完美运行
 私人开放页面(页面:任何):任何{
 //验证令牌 
 this.loggedIn = this.service.canActivate();
 如果(!this.loggedIn){
 //未登录 
 this.nav.setRoot(LoginPage);
 } 别的 {
 //记录
 this.nav.setRoot(HomePage);
 }
 this.menuCtrl.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 相同的问题。

如果我在 facebook 登录之前执行 setRoot,一切都会按预期进行。
如果我在 facebook 之后执行 setRoot,我会得到与 @joshuaohana 相同的行为。

谢谢。

(刚刚发现这个重复:https://github.com/driftyco/ionic/issues/6297)

为注销工作创建事件。

另外,请在下面找到有关导航的详细说明以及另一种工作解决方案

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

下面粘贴的最有价值的一段代码。

从“离子角度”导入{应用程序};
...
构造函数(私有_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”使用导航,但同时在 HTML 模板上仍然可以使用绑定“[root]=..”。 再次同步这两个信息解决了我的问题。 在这种情况下,我删除了模型绑定并仅通过 API 管理根。

问候,迈克尔

嗨,大家好,

@ly-dev 解决方案对我有用。 我刚刚做this._app.getRootNav().setRoot(EntryPage);并且它有效。

首先,从 ionic-angular 导入 Nav,与 navController 相同的位置
import { App, NavController } from 'ionic-angular';

然后在您的构造函数中提供它:
constructor(public navCtrl: NavController, public appCtrl: App)

现在您可以访问 rootnav:
this.appCtrl.getRootNav().setRoot(YourComponent);

@AmitPoojary该解决方案没有奏效。 当用户转到多个选项卡时。

示例:具有多个页面的主页选项卡。 当用户点击进入多个页面时。 然后不会返回,而是切换到“帐户”选项卡,然后注销它将保留在“帐户”选项卡上,直到刷新。

我已经弄清楚如果用户单击“主页”选项卡并且没有进一步操作,它将正确地注销用户。

我认为这一切都是为了访问 dom 中的许多选项卡,当用户进入主页选项卡的第二页时, getRootNav并不会返回那么远。

这仍然是一个问题。

是的,对我来说仍然是一个问题,因为我使用 Tab 作为应用程序的主要登录页面。 通过从 tabComponent 内的任何页面调用 _navCtrl.setRoot(),只有该页面设置为 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 版解决

welp,3.5.3 没有为我修复它。

伙计们,在 setRoot() 之后仍然有这个问题侧边栏不起作用;

我只使用这个:this.navCtrl.setRoot(HomePage);

我在这里尝试了所有解决方案,但仍然遇到这个问题
离子 3.10.3

我就这样解决了

导入应用

从 'ionic-angular' 导入 { IonicPage, NavController, Nav, App };

现在使用

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

您好,我正在 iPhone4 和其他一些带有 Android 的设备上测试 hello world 应用程序。

最后一个 Ionic 和 CLI 版本。

主要的大问题是 iPhone,对 setRoot 的调用不起作用。

无效 onGoClick(){
// 此行不执行任何操作,也不会引发错误。
this.navCtrl.setRoot(HomePage);

// 此行不执行任何操作,也不会引发错误。
this.app.getRootNav().setRoot(HomePage);
}

这也不起作用

var root = this.appCtrl.getRootNav();
root.setRoot( 主页 );
root.popToRoot();

问候。

@alemdg ,我认为这是您调用路由的方式,例如,如果您定义为文本或对象,无论如何,

如果您想避免问题,请像文本(“HomePage”)一样调用并创建此变量

const root = this.app.getRootNav();

并调用以下方法

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

导入这个对象

从 'ionic-angular' 导入 { IonicPage, NavController, NavParams, Nav, App };

构造函数(
公共应用程序:应用程序
) {

第一个是popToRoot,第二个是定义新根;)

无效 onGoClick(){
// 此行不执行任何操作,也不会引发错误。
this.navCtrl.setRoot("主页");

// 此行不执行任何操作,也不会引发错误。
root.popToRoot();
root.setRoot("主页");
}

这也不起作用

const root = this.appCtrl.getRootNav();
root.popToRoot();
root.setRoot("主页");

@spidermay感谢您的回答,但仍然无法正常工作。

我进口的
从 'ionic-angular' 导入 { IonicPage, NavController, NavParams, Nav, App };

并执行
const root = this.app.getRootNav();
root.popToRoot();
root.setRoot("主页");

但是,如果我单击该按钮两次,它就可以工作....

就像缺少一些刷新一样......

我在 3.7.1 上看到了这个。

使用下面的代码它必须工作或给你一个错误信息

this.menu.close();
this.nav.setRoot(HomePage).then(()=>{
this.nav.popToRoot();
}).catch(错误=>{
警报(err.toString());
});

@FatehiAlqa​​dasi ,谢谢。
抛出错误,这是日志。

呃:
C@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21236
file:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21702
file:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21967
reduce@[本机代码]
O@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21927
格式@文件:///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
@file:///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
file:///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
我们@file:///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
file:///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
file:///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
file:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21702
file:///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21967
reduce@[本机代码]
O@file :///var/containers/Bundle/Application/B7F05CCA-3B74-4F26-A691-B0D9F669E526/SGI.app/www/build/main.js:7:21927
格式@文件:///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
@file:///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
file:///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
我们@file:///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
file:///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
file:///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");

}

2岁的错误,仍然没有人敢修复它......我在Ionic 3中遇到了同样的问题

大家好,

我可以从根页面获取我的所有数据,也可以导航,但无法将页面导航到选项卡之外,它像选项卡的子项一样打开。

尝试了所有可能性来解决它,但没有任何操作有效。

我的数据所在的标签页。
1st

单击获取的数据后,它将重定向到数据的详细信息页面,它被重定向但在标签页内。 像这样...

2nd

帮帮我,

提前致谢。

[email protected] 开始,我已经注意到了这个错误。 它似乎与 DeepLinkConfig 相关联,因为如果我从我的 app.module 中删除它,那么我可以整天调用 nav.setRoot() 而不会出现问题。 我的假设是,在后续调用 setRoot() 之后,深度链接逻辑进入导航堆栈在 window.location 之前发生变化的状态,深度链接代码看到 window.location 指向的页面不在堆栈(因为您已将 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');
  }

这是我发现设置新导航堆栈并删除旧导航堆栈的方式。 这是为离子角 3.9.2完成的

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

谢谢你的问题! 此问题已被锁定,以防止与原始问题无关的评论。 如果这仍然是最新版本的 Ionic 的问题,请创建一个新问题并确保完整填写模板。

此页面是否有帮助?
0 / 5 - 0 等级