我正面临我的ionic2应用程序的问题。情况是当应用程序返回时我将本地存储中的最后一个状态保存,当应用程序恢复时,检查本地存储中是否有lastState的值。如果它有一个值,则推送该状态。我得到的错误是
ERROR Error: Uncaught (in promise): invalid link: <StateName>
at c (file:///android_asset/www/build/polyfills.js:3:13190)
at Object.reject (file:///android_asset/www/build/polyfills.js:3:12546)
at NavControllerBase._fireError (file:///android_asset/www/build/main.js:44942:16)
at NavControllerBase._failed (file:///android_asset/www/build/main.js:44930:14)
at file:///android_asset/www/build/main.js:44985:59
at t.invoke (file:///android_asset/www/build/polyfills.js:3:8971)
at Object.onInvoke (file:///android_asset/www/build/main.js:4407:37)
at t.invoke (file:///android_asset/www/build/polyfills.js:3:8911)
at r.run (file:///android_asset/www/build/polyfills.js:3:4140)
at file:///android_asset/www/build/polyfills.js:3:13731
但应用程序运行正常。有谁能告诉我这种行为的原因?
app.component.ts
this.platform.pause.subscribe(() => {
console.log('[INFO] App Paused.');
localStorage.setItem("lastState", this.nav.last().name);
})
this.platform.resume.subscribe(() => {
console.log('[INFO] App resumed);
if(null != localStorage.getItem("lastState") && localStorage.getItem("lastState") != undefined) {
this.nav.push(localStorage.getItem("lastState"));
}
});
注意:我已在app.module.ts
答案 0 :(得分:3)
案例是您尝试从页面中推送字符串而不是导入的模块,只有在模块中使用延迟加载时才会起作用。 您有两个选择:
this.nav.push(this.yourCreatedObject[localStorage.getItem("lastState")]);
来访问具有该模块的对象中的参数(我甚至不知道这是否有效,但是如果你的话,它值得一试不想浪费时间延迟加载)。只是观察:
当您进入暂停状态时,应用程序将保留在暂停之前的页面上,无需保存页面并再次按下它,暂停时不会转到根目录或丢失导航堆栈。这可能对用户体验有害,因为你将在一个页面中,然后再次推送同一页面。所以考虑不要这样做。
PS:在resume方法的console.log()中缺少'
。
希望这有帮助
因此,如果您希望应用程序重新启动,则无需推送页面,您需要转到应用程序的根页面,因此请尝试this.nav.popToRoot()
。这样您就不需要保存状态或更改为延迟加载。
好的,所以15分钟后重新启动需要一个计数器,你可以将你的档案改为延迟加载。
您可以执行以下操作
public timer: any;
public counter: number = 0; // add these 2 variable to the scope of your class in app.components
this.platform.pause.subscribe(() => {
localStorage.setItem("lastState", this.nav.last().name);
this.timer = setInterval(()=>{
this.counter += 50;
}, 50);
});
this.platform.resume.subscribe(() => {
const lastState = localStorage.getItem("lastState"); //GET THE LATEST STATE, YOU'LL ALWAYS HAVE ONE BE CAUSE THE APP'LL ALWAYS PAUSE
clearInterval(this.timer); // CLEAR THE INTERVAL
if(this.counter < 900000) // IF IT'S UNDER NEEDED TIME. 900000 == 15 min
this.nav.setRoot(lastState);
else
this.nav.popToRoot();
});
这只会在应用程序暂停但未被杀死时才有效,如果您想要相同的行为,如果用户杀死并重新启动应用程序,那么您将遇到更多问题,例如比较上次用户的时间打开应用程序,如果不到15分钟。