2016-05-11 20 views
20

Sto lavorando a questo progetto angular2 in cui sto usando ROUTER_DIRECTIVES per navigare da un componente all'altro.Angolare 2: passaggio dei dati alle rotte?

Ci sono 2 componenti. Ad esempio PagesComponent & DesignerComponent.

Desidero passare da PagesComponent a DesignerComponent.

Finora il suo instradamento correttamente ma ho dovuto passare page Oggetto in modo che il progettista possa caricare l'oggetto di pagina in sé.

Ho provato a utilizzare RouteParams ma ha ottenuto l'oggetto pagina undefined.

sotto è il mio codice:

pages.component.ts

import {Component, OnInit ,Input} from 'angular2/core'; 
import { GlobalObjectsService} from './../../shared/services/global/global.objects.service'; 
import { ROUTER_DIRECTIVES, RouteConfig } from 'angular2/router'; 
import { DesignerComponent } from './../../designer/designer.component'; 
import {RouteParams} from 'angular2/router'; 

@Component({ 
    selector: 'pages',  
    directives:[ROUTER_DIRECTIVES,], 
    templateUrl: 'app/project-manager/pages/pages.component.html' 
}) 
@RouteConfig([ 
    { path: '/',name: 'Designer',component: DesignerComponent }  
]) 

export class PagesComponent implements OnInit { 
@Input() pages:any; 
public selectedWorkspace:any;  
constructor(private globalObjectsService:GlobalObjectsService) { 
    this.selectedWorkspace=this.globalObjectsService.selectedWorkspace;      
} 
ngOnInit() { } 
} 

nel codice HTML, che sto facendo seguente:

<scrollable height="300" class="list-group" style="overflow-y: auto; width: auto; height: 200px;" *ngFor="#page of pages"> 
    {{page.name}}<a [routerLink]="['Designer',{page: page}]" title="Page Designer"><i class="fa fa-edit"></i></a> 
</scrollable> 

Nel costruttore DesignerComponent che ho fatto il seguente:

constructor(params: RouteParams) { 
    this.page = params.get('page'); 
    console.log(this.page);//undefined 
} 

Finora il suo instradamento correttamente per progettista, ma quando sto cercando di accedere a page oggetto nel designer, quindi la sua mostra undefined. Qualche soluzione?

+2

'ROUTER_DIRECTIVES' suona come se usassi una versione Angolare del Medioevo ;-) –

risposta

15

Non è possibile passare oggetti utilizzando parametri del router, solo stringhe perché è necessario che si riflettano nell'URL. Sarebbe probabilmente un approccio migliore per utilizzare un servizio condiviso per passare comunque i dati tra componenti instradati.

Il vecchio router consente di passare data ma il nuovo router (RC.1) non è ancora installato.

Aggiornamento

data stato reintrodotto in RC.4How do I pass data in Angular 2 components while using Routing?

+0

quindi cosa si può fare nello scenario attuale guardando questo progetto? –

+0

Fornisci un servizio al componente principale e lo inserisci in entrambi i componenti indirizzati. Quando si imposta una proprietà da un componente, l'altro può leggere la proprietà. https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service –

+0

Ho usato questo approccio per scopi diversi. Stavo pensando se posso passare a page_id come una stringa, quindi va bene anche a me. ma ottiene anche page_id come null. –

12

Si cambia in angolare 2.1.0

In something.module.ts

import { NgModule } from '@angular/core'; 
import { CommonModule } from '@angular/common'; 
import { BlogComponent } from './blog.component'; 
import { AddComponent } from './add/add.component'; 
import { EditComponent } from './edit/edit.component'; 
import { RouterModule } from '@angular/router'; 
import { MaterialModule } from '@angular/material'; 
import { FormsModule } from '@angular/forms'; 
const routes = [ 
    { 
    path: '', 
    component: BlogComponent 
    }, 
    { 
    path: 'add', 
    component: AddComponent 
    }, 
    { 
    path: 'edit/:id', 
    component: EditComponent, 
    data: { 
     type: 'edit' 
    } 
    } 

]; 
@NgModule({ 
    imports: [ 
    CommonModule, 
    RouterModule.forChild(routes), 
    MaterialModule.forRoot(), 
    FormsModule 
    ], 
    declarations: [BlogComponent, EditComponent, AddComponent] 
}) 
export class BlogModule { } 

Per ottenere il dati o parametri nel componente di modifica

import { Component, OnInit } from '@angular/core'; 
import { Router, ActivatedRoute, Params, Data } from '@angular/router'; 
@Component({ 
    selector: 'app-edit', 
    templateUrl: './edit.component.html', 
    styleUrls: ['./edit.component.css'] 
}) 
export class EditComponent implements OnInit { 
    constructor(
    private route: ActivatedRoute, 
    private router: Router 

) { } 
    ngOnInit() { 

    this.route.snapshot.params['id']; 
    this.route.snapshot.data['type']; 

    } 
} 
+7

Puoi passare quei dati nel percorso nel punto di navigazione invece della configurazione del routing? Ad esempio, in una situazione di dettaglio principale in cui il componente di dettaglio sostituisce (quindi non è figlio del) componente principale, è possibile passare l'oggetto dati master al componente di dettaglio mentre si naviga in esso in modo che il componente di dettaglio possa visualizzare alcuni dei i suoi dati mentre carica i dati di dettaglio? – Sebastien

+2

@Sebastien hai ricevuto la tua risposta ... dicci come l'hai fatto –

1

Si può fare questo:

app-instradamento-modules.ts:

import { NgModule     } from '@angular/core'; 
import { RouterModule, Routes  } from '@angular/router'; 
import { PowerBoosterComponent  } from './component/power-booster.component'; 


export const routes: Routes = [ 
    { path: 'pipeexamples',component: PowerBoosterComponent, 
data:{ name:'shubham' } }, 
    ]; 
    @NgModule({ 
     imports: [ RouterModule.forRoot(routes) ], 
     exports: [ RouterModule ] 
    }) 
    export class AppRoutingModule {} 

In questo percorso di cui sopra, voglio inviare i dati tramite un percorso pipeexamples a PowerBoosterComponent.Così ora posso ricevere questi dati in PowerBoosterComponent come questo:

potenza Booster component.ts

import { Component, OnInit } from '@angular/core'; 
import { Router, ActivatedRoute, Params, Data } from '@angular/router'; 

@Component({ 
    selector: 'power-booster', 
    template: ` 
    <h2>Power Booster</h2>` 
}) 

export class PowerBoosterComponent implements OnInit { 
    constructor(
    private route: ActivatedRoute, 
    private router: Router 

) { } 
    ngOnInit() { 
    //this.route.snapshot.data['name'] 
    console.log("Data via params: ",this.route.snapshot.data['name']); 
    } 
} 

Così si può ottenere i dati dal this.route.snapshot.data['name'].

+8

E se volessi impostare i dati dinamicamente? Ad esempio, quando si utilizza router.navigate()? – FelipeDrumond

+0

Non fare nuove domande tramite commenti. Cerca prima, poi posta una nuova domanda se devi. è possibile impostare i dati dinamicamente in questo modo: - this.router.navigate (['/ detail', this.object.id]); –

+0

Ho notato che è possibile ottenere il solo 'ActivatedRoute' quando lo si passa tramite DI. Perché non riesci a ottenerlo dal 'Router'? –

Problemi correlati