2016-05-11 13 views
20

Ich arbeite an diesem angular2-Projekt, in dem ich ROUTER_DIRECTIVES verwende, um von einer Komponente zur anderen zu navigieren.Angular 2: Daten an Routen übergeben?

Es gibt 2 Komponenten. h. PagesComponent & DesignerComponent.

Ich möchte von PagesComponent zu DesignerComponent navigieren.

Bis jetzt seine Routing korrekt, aber ich musste übergeben page Object so Designer kann diese Seite Objekt in sich laden.

Ich habe versucht, RouteParams, aber es ruft Seite Objekt undefined.

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() { } 
} 

Im html, ich tue folgendes:

<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> 

Im DesignerComponent Konstruktor Ich habe getan,

unter mein Code die folgenden:

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

Bis jetzt seine Routing korrekt zu Designer, aber wenn ich versuche, auf page Objekt in Designer zugreifen, dann zeigt es undefined. Irgendwelche Lösungen?

+2

'ROUTER_DIRECTIVES' klingt wie Sie eine Angular-Version aus dem dunklen Alter verwenden ;-) –

Antwort

15

Sie können Objekte nicht mit Hilfe von Router-Parametern übergeben, nur Strings, da sie in der URL reflektiert werden müssen. Es wäre wahrscheinlich ein besserer Ansatz, einen gemeinsam genutzten Dienst zu verwenden, um Daten ohnehin zwischen gerouteten Komponenten weiterzuleiten.

Der alte Router erlaubt data zu übergeben, aber der neue Router (RC.1) noch nicht.

aktualisieren

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

+0

Was also kann im aktuellen Szenario bei diesem Projekt getan werden? –

+0

Sie stellen einen Dienst an der übergeordneten Komponente bereit und injizieren ihn in beide gerouteten Komponenten. Wenn Sie eine Eigenschaft aus einer Komponente auswählen, kann die andere die Eigenschaft lesen. https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service –

+0

Ich habe diesen Ansatz für verschiedene Zwecke verwendet. Ich dachte, wenn ich page_id als String übergeben kann, dann ist es auch in Ordnung. aber es bekommt page_id auch als null. –

12

Es in Winkel 2.1.0

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 { } 

auf die in something.module.ts wechselt wieder eingeführt zu erhalten Daten oder Parameter in der Edit-Komponente

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

Können Sie diese Daten in der Route am Navigationspunkt anstelle der Routing-Konfiguration übergeben? Beispielsweise können Sie in einer Master-Detail-Situation, in der die Detailkomponente die Masterkomponente ersetzt (also nicht untergeordnet ist), das Masterdatenobjekt an die Detailkomponente übergeben, während Sie zu ihr navigieren, sodass die Detailkomponente einige davon anzeigen kann seine Daten, während es die Detaildaten lädt? – Sebastien

+2

@Sebastien hast du deine Antwort bekommen ... plzz erzählen, wie du es gemacht hast –

1

Sie können dies tun:

app-Routing-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 dieser oben Route mag ich Daten über einen pipeexamples Pfad zu PowerBoosterComponent senden.So, jetzt kann ich diese Daten in PowerBoosterComponent wie folgt erhalten:

Power-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']); 
    } 
} 

So können Sie die Daten von this.route.snapshot.data['name'] erhalten.

+8

Was ist, wenn ich die Daten dynamisch einstellen möchte? Zum Beispiel, wenn router.navigate() verwendet wird? – FelipeDrumond

+0

Stellen Sie keine neuen Fragen über Kommentare. Suche zuerst, dann posten Sie eine neue Frage, wenn Sie müssen. Sie können die Daten dynamisch wie folgt einstellen: - this.router.navigate (['/ detail', this.object.id]); –

+0

Ich bemerke, dass Sie die 'ActivatedRoute' nur erhalten können, wenn Sie sie über DI übergeben. Warum können Sie es nicht vom 'Router' erhalten? –

Verwandte Themen