Cordova angular app on hardware back按钮按下,打开上次打开的视图

Cordova angular app on hardware back按钮按下,打开上次打开的视图,cordova,ngcordova,Cordova,Ngcordova,最初,我看到的是“A”,然后我从api加载了一些东西。现在,当点击按钮时,我移到视图“B”,然后当点击后退按钮(硬件/导航栏后退按钮)时,我移回视图A,但视图A的内容已经被破坏,只有简单视图被加载 window.history.back(); 因此,我想出了一种方法,即在每次加载视图时,我都将其添加到本地存储状态数组中。当按下back键时,我返回到以前的状态 this.router.navigate([previousState]); 但这只在导航栏按钮点击时起作用。在硬按钮单击时,我被导航

最初,我看到的是“A”,然后我从api加载了一些东西。现在,当点击按钮时,我移到视图“B”,然后当点击后退按钮(硬件/导航栏后退按钮)时,我移回视图A,但视图A的内容已经被破坏,只有简单视图被加载

window.history.back();
因此,我想出了一种方法,即在每次加载视图时,我都将其添加到本地存储状态数组中。当按下back键时,我返回到以前的状态

this.router.navigate([previousState]);
但这只在导航栏按钮点击时起作用。在硬按钮单击时,我被导航回,但我的状态不会再次获取

我的代码是:

@Injectable()
export class AppStateService {
private menuOpen: boolean = false;
private headerTitle: string = "";
private offlineState: boolean = false;


public constructor(private router: Router) {
    document.addEventListener("backbutton", () => {
        this.back(true);
    }, false);
}

public back(hardwareClick?: boolean): void {

    var routes: string[] = [
        'Login',
        'Main'
    ];
    for (var i of routes) {
        var route = this.router.generate([i]);
        if (this.router.isRouteActive(route)) {
            this.exitApp();
            return;
        }
    }

    var  previousState = CordovaService.getPreviousState();
    this.router.navigate([previousState]);

}
可视示例:

但是,当导航栏返回按钮单击时,从B到A可以正常工作
可能是什么问题?

您正在尝试解决一个由您自己造成的问题。首先,您不应在同一Cordova应用程序上创建多个页面

这是第一个原则:

1) SPA是你的朋友

首先,您的Cordova应用程序应采用SPA (单页应用)设计。从广义上讲,SPA是一种 从网页的一个请求运行的客户端应用程序。 用户加载一组初始资源(HTML、CSS和JavaScript) 进一步的更新(显示新视图、加载数据)通过 AJAXSPA通常用于更复杂的客户端 应用。GMail就是一个很好的例子。加载GMail后, 邮件视图、编辑和组织都是通过更新DOM来完成的 而不是离开当前页面来加载一个全新的 一个

是的,您可能需要编写更多的代码,但仍然可以使用多个JS文件在单个页面中创建视图。多页方法还具有性能惩罚:

即使您选择不使用Cordova,也要创建一个移动应用程序 如果不使用单页架构,将有严重的性能问题 启示。这是因为在页面之间导航需要 要重新加载的脚本、资产等。即使这些资产 缓存后,仍将存在性能问题