从Ionic2中的resume()启动以前的状态

时间:2017-08-10 13:48:28

标签: angular typescript ionic2

我正面临我的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);
     })

resume()方法

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

中添加了所有组件名称

1 个答案:

答案 0 :(得分:3)

案例是您尝试从页面中推送字符串而不是导入的模块,只有在模块中使用延迟加载时才会起作用。 您有两个选择:

  • 延迟加载所有页面组件,以便您可以在NavController上将它们用作字符串而不是导入的模块名称。
  • 导入所有页面,使用它们创建一个对象并调用this.nav.push(this.yourCreatedObject[localStorage.getItem("lastState")]);来访问具有该模块的对象中的参数(我甚至不知道这是否有效,但是如果你的话,它值得一试不想浪费时间延迟加载)。

只是观察:

当您进入暂停状态时,应用程序将保留在暂停之前的页面上,无需保存页面并再次按下它,暂停时不会转到根目录或丢失导航堆栈。这可能对用户体验有害,因为你将在一个页面中,然后再次推送同一页面。所以考虑不要这样做。

PS:在resume方法的console.log()中缺少'

希望这有帮助

修改

因此,如果您希望应用程序重新启动,则无需推送页面,您需要转到应用程序的根页面,因此请尝试this.nav.popToRoot()。这样您就不需要保存状态或更改为延迟加载。

编辑2

好的,所以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分钟。