2016-05-06 4 views
6

używane mieć, z przestarzałej routera, kilka elementów, które kierowane do tej samej części:Angular2 RC1, nowy router i przekazywanie danych

Niektóre Komponent

import {Component, Injector} from 'angular2/core'; 
import {IDataServiceSome} from './IDataServiceSome'; 
import {RouteData} from 'angular2/router'; 

@Component({ 
    selector: 'Some', 
    templateUrl: './Some.html' 
}) 
export class Some { 
    Model; 
    DataService: IDataServiceVendor; 

    constructor(routeData: RouteData, injector: Injector) { 
     var dataServiceToken = routeData.get('DataServiceToken'); 
     this.DataService = injector.get(dataServiceToken); 
     this.Model = DataService.getSomeModel(); 
    } 
} 

IDataServiceSome

export interface IDataServiceSome { 
    getSomeModel(): Object; 
} 

np. Comp1 ale istnieją Comp2, KOMP3, etc ...

import {Component} from 'angular2/core'; 
import {RouteConfigs, Router, ROUTER_DIRECTIVES} from 'angular2/router'; 

import {DataServiceSome1} from './IDataServiceSome1'; 

@RouteConfigs([ 
    { path: '/Some', name: 'Some', component: Some, data: { DataServiceToken: DataServiceSome1 } }]) 
@Component({ 
    directives: [ROUTER_DIRECTIVES], 
    providers: [DataServiceSome1], 
    selector: 'Comp1', 
    template: 
    `<div> 
     <router-outlet></router-outlet> 
     <h1>Comp1 routed to Some</h1> 
    </div>` 
}) 
export class Comp1{ 

} 

Jak można się domyślić, istnieje wiele usług transmisji danych, które implementują IDataServiceSome i wiele składników, które trasa do Some. Wybór usługi przesyłania danych pochodzi z dowolnego komponentu, który prowadzi do komponentu Some przy użyciu tokena danych znanego pod numerem injector. Wraz z wydaniem rc1 i nowym routerem, RouteData jest przestarzałe lub usunięte, ale w jaki sposób jest realizowany ten scenariusz do przodu?

Odpowiedz

2

Poczekaj, aż Angular2 doda z powrotem data. W moim przypadku usługa, która decyduje, która usługa danych jest potrzebna, może zostać wstrzyknięta za pośrednictwem DI. Stwierdziłem, że to przesada, to po prostu parametry przejściowe, tak jak w ciągach zapytań URL. Jedyną różnicą było to, że parametr nie powinien być widoczny dla użytkownika, aby uzyskać lepsze wrażenia.

Źródło:

http://www.github.com/angular/angular/issues/8515

2

aktualizacja

RC.4 przynosi data powrotem

  • przekazywanie danych z wykorzystaniem trasy
{ path: 'parent/:id', data: {one: 1}, resolve: {two: 'resolveTwo'}} 

i uzyskać do niego dostęp za pomocą

this.route.snapshot.data 

lub

this.route 
     .data 
     .subscribe(v => console.log(v)); 

Patrz także Plunker na https://github.com/angular/angular/issues/9757#issuecomment-229847781

oryginalny

Parametry mogą być przekazywane jak:

  • z linkiem routera
<a [routerLink]="['/crisis-center', {bar: 'foo1'}]">Crisis Center</a> 
  • z router.navigate()
this.router.navigate(['/crisis-center', {bar: 'foo2'}]); 

Plunker example

app/app.component.ts zawiera linki i kod tam, gdzie parametry są przekazywane, app/crisis-center/crisis-center.coomponent.ts zawiera kod, gdzie parametr jest odczytywany i zapisywany na konsoli.

Nie sądzę, że istnieje już obsługa dodatkowych danych.

+0

Ale nie wspiera 'data' oznacza, że ​​albo trzeba użyć parametrów ciąg kwerendy lub trasy. Oba są częścią przykładu "wycieczki bohaterów". W moim przypadku tak naprawdę nie chcę, aby użytkownik zobaczył token usługi danych jako część adresu URL i nie ma ku temu powodu. Więc nie do końca rozumiem, dlaczego 'dane' jest usuwany. – RoninCoder

+0

Trasy są po prostu adresem URL i nazwą komponentu. Nie ma również żadnych nazw tras. Jeśli chcesz przekazać inne dane, które nie są odzwierciedlone w adresie URL, skorzystaj z usługi udostępnionej. –

+0

duh! więc potrzebujesz usługi, aby powiedzieć komponentowi 'Some', jakiej usługi danych użyć? nawet robiąc to, jak trudno jest ustalić, który komponent był ostatnim, który ustawił usługę danych, która ma być używana przez 'Some'? debugowanie koszmaru. Z drugiej strony mediator może pomóc, ale całkowicie uznaję to za niepotrzebną złożoność. – RoninCoder