我正在用 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
谢谢你。
我注意到以下几点:dom 中同时存在 2 个离子页面。
我导航到的是“探索”,它的 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 设备上发生
设备信息:
我在2.0.0-beta.10中面临这个问题。 我无法通过 NavController.setRoot 导航到下一页。 我的代码如下所示:
this.nav.setRoot(somepage).then(() =>{
this.nav.popToRoot();
});
设备信息:
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 或任何东西。 不过再次感谢。 这个问题不应该被关闭,除非有另一个具有相同描述的打开。
显然有:
我也在非常相似的情况下遇到了这个问题。 在我的情况下,切换到 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,但底部的选项卡界面保持不变。 这使我仍然可以访问选项卡中的其他页面!
正确的解决方案是:
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());
});
嗨@FatehiAlqadasi ,谢谢。
抛出错误,这是日志。
呃:
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中遇到了同样的问题
大家好,
我可以从根页面获取我的所有数据,也可以导航,但无法将页面导航到选项卡之外,它像选项卡的子项一样打开。
尝试了所有可能性来解决它,但没有任何操作有效。
我的数据所在的标签页。
单击获取的数据后,它将重定向到数据的详细信息页面,它被重定向但在标签页内。 像这样...
帮帮我,
提前致谢。
从[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 的问题,请创建一个新问题并确保完整填写模板。
最有用的评论
为什么这个问题被关闭了? 导航似乎真的坏了。 如果我推送一个包含表单的页面,它也不会工作。