2016-07-18 12 views
3

パラメータ付きの別のページに移動したいが、それをうまく説明するドキュメントが見つからないようだ。私はルートを使用しています。ここに私のルートの例があります。最新のNativeScriptで角型とTypeScriptを使用してパラメータを移動する

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などのクラスを発見したが、私はPageNavigationContextを送信する方法を考え出したていません。それともそれを送信しなければならない場合でも。したがって、問題は、Routingを使用して別のページ(ダイアログではない)に移動し、パラメータを渡す最も良い方法は何ですか?

答えて

7

あなたはこのルートのパラメータ持つべきであると表明する必要があります。そして、あなたがそのように渡すことができ

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

を:あなたのDetailsPage

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

あなたのようにパラメータを取得することができますサービスActivatedRouteで観測可能です。

+0

私はこの解決策を試してみましたが、一度コードを "詳細"の前にスラッシュを入れるようにメソッド呼び出しを変更した場合は、this._router.navigate([/ details "、selectedItem.id]);'新しいページが表示されます。しかし、画面が表示されても、ngOnInitが呼び出されていないことに気付きました。デバッグの後、 'apply_redirects.js'の' expandPathsWithParams(segment、routes、paths、outlet、allowRedirects) 'が' NoMatch'例外をスローしていることがわかりました。したがって、コンストラクタは実行されますが、ngOnInitは実行されません。 – Rob

+0

ページが表示されたら、 'ngOnInit'が呼び出されますか? 'DetailsPage'コンポーネントをここに追加できますか? –

+0

ngOnInitが呼び出されていません。呼び出される前に、コアコアコードの 'expandPathsWithParams'に例外がスローされます。詳細コンポーネントとテンプレートコードを追加しました。知るべきもう一つのことは、main.tsの行をthis._router.navigate(["/ details"、selectedItem.name]);に変更したことです。 – Rob

関連する問題