使用 Angular 和 TypeScript 使用最新 NativeScript 中的参数进行导航

Posted

技术标签:

【中文标题】使用 Angular 和 TypeScript 使用最新 NativeScript 中的参数进行导航【英文标题】:Navigate with parameters in latest NativeScript with Angular and TypeScript 【发布时间】:2016-11-21 10:56:24 【问题描述】:

我想导航到带有参数的另一个页面,但我似乎找不到能很好地解释它的文档。我正在使用路线。这是我的路线示例。

import  RouterConfig  from '@angular/router';
import  nsProvideRouter  from 'nativescript-angular/router';
import  MainPage  from './pages/main/main.component';
import  DetailsPage  from './pages/details/details.component';

export const routes: RouterConfig = [
     path: "", component: MainPage ,
     path: "details", component: DetailsPage 
];

export const APP_ROUTER_PROVIDERS = [
    nsProvideRouter(routes, )
];

我想使用 MainPage 上选择的参数导航到 DetailsPage。以下是 MainPage 的摘录:

import  Page  from 'ui/page';
import  Component, ElementRef, OnInit, ViewChild  from '@angular/core';
import  Entity  from '../../shared/entity/entity';

@Component(
    selector: "main",
    templateUrl: "pages/main/main.html",
    styleUrls: ["pages/main/main-common.css", "pages/main/main.css"]
)
export /**
 * MainPage
 */
class MainPage 

    constructor(private _page: Page, private _router: Router)  

    onNavigate(selectedItem: Entity) 
        // Can't figure out how to get selectedItem to details…
        this._router.navigate(["/details"]);
    ;

已插入:下面我添加了详细信息类。

import  Component, OnInit, OnDestroy  from '@angular/core';
import  ActivatedRoute  from '@angular/router';
import  Entity  from '../../shared/entity/entity';
import  EntityModel  from '../../shared/entity/entity.model';

@Component(
    selector: "detail",
    templateUrl: "pages/detail/detail.html",
    styleUrls: ["pages/detail/detail-common.css", "pages/detail/detail.css"],
    providers: [EntityModel] 
)
export /**
 * DetailPage
 */
class DetailPage implements OnInit, OnDestroy 

    entity: Entity;

    private _paramSubcription: any;

    constructor( private _activatedRoute: ActivatedRoute, private _entityModel: EntityModel )  

    ngOnInit() 
        console.log("detail ngOnInit was called.");
        let entityName: string;
        this._paramSubcription = this._activatedRoute.params.subscribe(params => entityName = params['id']);
        this.entity = this._entityModel.entityNamed(entityName);
    ;

    ngOnDestroy() 
        if (this._paramSubcription) 
            this._paramSubcription.unsubscribe();
        ;
    ;

这是详细信息的模板:

<ActionBar [title]="entity.name"></ActionBar>
<ListView [items]="entity.items">
    <Template let-item="item">
        <StackLayout>
            <Label [text]="item.name"></Label>
            <Label [text]="item.description"></Label>
        </StackLayout>
    </Template>
</ListView>

我找到了像NavigationContext 这样的类和方法navigateTonavigateFrom,但我还没有弄清楚如何将NavigationContext 发送到Page。或者如果它甚至应该以这种方式发送。那么问题来了,使用Routing 导航到另一个页面(不是对话框)并传递参数的最佳方式是什么?

【问题讨论】:

【参考方案1】:

你需要表明你应该在这个路由中有参数:

export const routes: RouterConfig = [
     path: "", component: MainPage ,
     path: "details/:id", component: DetailsPage 
];

那么,你可以这样传递:

this._router.navigate(["/details", selectedItem.id]);

在您的DetailsPage 中,您可以使用ActivatedRoute 服务将参数作为可观察的。

【讨论】:

我尝试了这个解决方案,一旦我更改了方法调用以在“详细信息”前面放置一个正斜杠,因此在代码中它是 this._router.navigate(["/details", selectedItem.id]); 新页面显示。然而,即使屏幕会显示我注意到 ngOnInit 没有被调用。经过一些调试,我发现apply_redirects.js 中的expandPathsWithParams(segment, routes, paths, outlet, allowRedirects) 正在抛出NoMatch 异常。所以构造函数运行但 ngOnInit 没有。 当页面显示时,ngOnInit 是否被调用?可以在这里添加DetailsPage 组件吗? ngOnInit 没有被调用。在调用它之前,角度核心代码中的expandPathsWithParams 中会引发异常。我添加了详细组件和模板代码。唯一要知道的是我将 main.ts 中的行更改为 this._router.navigate(["/details", selectedItem.name]);. 我能够首先通过一个测试项目证明这是可行的,然后通过从源页面和目标页面中删除几乎所有内容来证明这一点。我目前正在尝试恢复所有功能并遇到各种问题。但无论如何我都在检查它是否正确。谢谢。 +Doron 有没有机会链接到文档或有关 ActivatedRoute 的任何解释?

以上是关于使用 Angular 和 TypeScript 使用最新 NativeScript 中的参数进行导航的主要内容,如果未能解决你的问题,请参考以下文章

何时在 TypeScript / Angular 中使用接口和模型

如何让 Angular Universal 为 Firebase Cloud Functions 编译 Typescript

使用ASP.NET Web API和Web API Client Gen使Angular 2应用程序的开发更加高效

使用 Visual Studio Code 调试和运行 Angular 2 Typescript?

如何使用 webpack、typescript、phaser 和 angular 配置全局 css 和 sass 样式表

如何获取应用程序使用 typescript 运行的路径?