Nativescript后退按钮未重定向到正确的页面

Posted

技术标签:

【中文标题】Nativescript后退按钮未重定向到正确的页面【英文标题】:Nativescript Back Button not redirecting to the correct page 【发布时间】:2017-08-02 14:18:22 【问题描述】:

我正在尝试为 android 创建一个 Angular 2 组件,以显示特定 路径 的内容。为此,我创建了以下 app-routing.module:

 @NgModule(
  imports: [
    NativeScriptRouterModule.forRoot([
       path: '', component: HomeComponent ,
       path: 'folder-content/:path', component: FolderContentComponent ,

    ])
  ],
  exports: [NativeScriptRouterModule]
)

为了完整起见,这里是 folder-content.xml 的 xml

<StackLayout>
    <GridLayout row="auto, *" row="2">
        <ListView [items]="getContent(currentPath)">
            <template let-item="item">
                <GridLayout columns="auto, *"   [nsRouterLink]="['/folder-content', item.path]">
                    <GridLayout columns="auto" rows="auto" cssClass="favorite-wrap">
                        <Image id="imgFav" [src]="item.isFile() ? 'res://ic_add_to_fav_1': 'res://folder'" stretch = "none" cssClass="icon-image"></Image>
                    </GridLayout>
                    <StackLayout col="1">
                        <Label [text]="item.name" cssClass="info-bigger"></Label>
                        <Label [text]="item.path" cssClass="info-orange"></Label>
                    </StackLayout>
                </GridLayout>
            </template>
        </ListView>
    </GridLayout>
</StackLayout>

每次点击列表项时,我都想导航到同一页面,但使用不同的参数(这按预期工作)。

问题是当我尝试向后导航(使用物理后退按钮)时,我被重定向到 HomeComponent 而不是 FolderContentComponent。

我尝试使用以下 sn-p 打印路由器事件以获取更多信息:

 router.events.forEach((event) => 
     console.log(event);
    );

当从 默认路径 导航到 文件夹内容 +'/' 作为参数时,我得到以下信息:

JS: NavigationStart(id: 19, url: '/folder-content/%2F')
JS: RoutesRecognized(id: 19, url: '/folder-content/%2F', urlAfterRedirects: '/folder-content/%2F', state: Route(url:'', path:'')  Route(url:'folder-content/%2F', path:'folder-content/:path')  )
JS: NavigationEnd(id: 19, url: '/folder-content/%2F', urlAfterRedirects: '/folder-content/%2F')

folder-content +'/' 导航到 folder-content +'/sdcard' 时,我得到以下信息:

JS: NavigationStart(id: 20, url: '/folder-content/%2Fsdcard')
JS: RoutesRecognized(id: 20, url: '/folder-content/%2Fsdcard', urlAfterRedirects: '/folder-content/%2Fsdcard', state: Route(url:'', path:'')  Route(url:'folder-content/%2Fsdcard', path:'folder-content/:path')  )
JS: NavigationEnd(id: 20, url: '/folder-content/%2Fsdcard', urlAfterRedirects: '/folder-content/%2Fsdcard')

但是,当按下后退按钮时,我希望从 folder-content +'/sdcard' 导航到 folder-content + '/'但相反,我被重定向到 '' (HomeComponent)

JS: NavigationStart(id: 21, url: '/')
JS: RoutesRecognized(id: 21, url: '/', urlAfterRedirects: '/', state: Route(url:'', path:'')  Route(url:'', path:'')  )
JS: NavigationEnd(id: 21, url: '/', urlAfterRedirects: '/')

值得一提的是,我使用的是 page-router-outlet 而不是标准的 Angular 路由器。

TNS 版本:2.5.1Angular 版本:2.4.3Android 平台 6.0.1

【问题讨论】:

你有多少个组件?只有首页,文件夹内容? 我有一个侧边栏组件,关于和联系人组件,以及应用程序组件。除了侧边栏之外,所有这些都只是没有实际功能的虚拟页面 你是否覆盖了android后退按钮事件? 不,因为根据文档,路由器应该支持开箱即用:docs.nativescript.org/angular/core-concepts/… @RaduCojocari 基于您的实施。就我而言,我已经根据我的要求覆盖了所有 android back 事件 【参考方案1】:

试试这个作为后退按钮。

在您的项目中添加此代码 app.component.ts :-

import * as application from "tns-core-modules/application";

clickCount: number = 0;

constructor() 
 if (application.android)             
  application.android.on(application.AndroidApplication.activityBackPressedEvent, (data: any) => 
            if (this._routerExtensions.router.url == '/home') 
                data.cancel = (this.clickCount++ > 0) ? false : true;
                if (data.cancel) Toast.makeText("Press again to exit", "long").show();
                setTimeout(() => 
                    this.tries = 0;
                , 2000);
            
        );
  

一个页面到另一个页面的重定向代码

import  NgZone  from "@angular/core";
import  isios  from "tns-core-modules/platform";
import  RouterExtensions  from "nativescript-angular/router";

constructor(private zone: NgZone,
    private _routerExtensions: RouterExtensions) 

gotoFolderContentPage() 
    setTimeout(() => 
        this.zone.run(() => 
            this._routerExtensions.navigate(["folder-content",1], 
                clearHistory: (isIOS) ? true : false,
            );
        );
    , 500);

【讨论】:

以上是关于Nativescript后退按钮未重定向到正确的页面的主要内容,如果未能解决你的问题,请参考以下文章

Paypal:Angular Js paypal 按钮未重定向到付款页面

使用谷歌登录后,登录按钮未重定向到主页

如何在nativescript vue中处理webview上的android后退按钮

NativeScript 处理后退按钮事件

android中webview的后退和前进按钮。如何?

发布 discount_amount 时,Paypal Standard 未重定向到移动结帐