2016-10-24 2 views
2

Ich möchte die Logik von Komponente zu Service verschieben. Aber ich habe herausgefunden, dass ich die routeParams nicht in einem Service bekommen kann.Angular 2 get routeParams in einem Service

Meine Komponente sieht aus wie

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

import { MyService }    from '../services/my.service'; 

@Component({ 
    moduleId: module.id, 
    templateUrl: 'my.component.html', 
    styleUrls: ['my.component.css'] 
}) 
export class MyComponent implements OnInit { 
    constructor(private myService: MyService, private route: ActivatedRoute) {;} 

    public ngOnInit() { 
    this.route.params 
     .subscribe((params: Params) => { 
     debugger; 
     console.log(params); 
     }); 
    this.myService.getParams() 
     .subscribe((params: Params) => { 
     debugger; 
     console.log('Return1:'); 
     console.log(params); 
     }, (params: Params) => { 
     debugger; 
     console.log('Return2:'); 
     console.log(params); 
     },() => { 
     debugger; 
     console.log('Return3:'); 
    }); 
    } 
}; 

Mein Service sieht aus wie

import { Injectable }      from '@angular/core'; 
import { Params, ActivatedRoute }   from '@angular/router'; 

import { Observable }      from 'rxjs'; 

@Injectable() 
export class MyService { 
    constructor(private route: ActivatedRoute) {;} 

    public getParams(): Observable<Params> {  
    this.route.params.subscribe((params: Params) => { 
     debugger; 
     console.log('Service1:'); 
     console.log(params); 
    }, (params: Params) => { 
     debugger; 
     console.log('Service2:'); 
     console.log(params); 
    },() => { 
     debugger; 
     console.log('Service3:'); 
    }); 
    return this.route.params; 
    } 
}; 

Wenn ich mich debuggen kann sehen, dass params in der Komponente und leer in Betrieb gefüllt sind. Das ist das Ergebnis

Component: 
Object {param: "1"} 
Service1: 
Object {} 
Return1: 
Object {} 

Ich benutze Angular 2.0.0. Warum der Unterschied in Komponente und Service? Ist es möglich, Params in einem Service zu bekommen?

EDIT: https://github.com/angular/angular/issues/11023

+0

haben Sie done Abschnitt der subscribe-Methode versucht? – Lonely

+0

Ich habe onError und onComplete hinzugefügt, aber die Funktionen werden nicht ausgeführt. Ich versuche 3 mal params zu bekommen. Einmal direkt in der Komponente, einmal direkt im Service und einmal in der Komponente als Rückkehr aus dem Service. Und nur der erste Versuch funktioniert. –

Antwort

2

Wir ActivatedRoute passieren können von der Komponente zu bedienen . Dann abonnieren Sie route.params in der Serviceklasse

+0

Ja, das ist die Art, wie ich es gerade mache. Aber es ist ein Workaround. Auf diese Weise haben wir Logik in der Komponente und wir müssen diese Logik in jede Komponente implementieren, in der ich diesen Dienst verwenden möchte. Warum ist es in einem Dienst nicht möglich? –

+0

Die Dienste werden beim Start der Anwendung initialisiert und dann in die Komponente injiziert, wo immer dies erforderlich ist. Komponenten werden basierend auf Routenänderungen initialisiert und ActivatedRoute gehört zur Komponente. Dies basiert auf meinem Verständnis. – Eswar

+0

Das Problem ist hier beschrieben: https://github.com/angular/angular/issues/11023 –

0

das Problem ist die

return this.route.params; 

die Strecke params in diesem Moment nicht bereit sind -> Observablen -> Asynchronität

+0

'this.route.params' ist eine beobachtbare, also gebe ich eine beobachtbare zurück und ich abonniere diese beobachtbare. Außerdem, wie Sie sehen können, funktioniert es auch nicht im Service. Warum? –

+0

Könnten Sie es bitte in PLNKR einfügen? – Lonely

+0

Ich weiß nicht wie. –

4

Gemäß this müssen Sie den Routenbaum durchqueren und die Daten von der Route am Ende des Baumes abrufen.

@Injectable() 
export class MyService{ 

    constructor(private router:Router,private route:ActivatedRoute){ 
    this.router.events 
    .filter(event => event instanceof NavigationEnd) 
    .subscribe((event) => { 
     let r=this.route; 
     while (r.firstChild) { 
      r = r.firstChild 
     } 
     //we need to use first, or we will end up having 
     //and increasing number of subscriptions after each route change. 
     r.params.first().subscribe(params=>{     
      // Now you can use the params to do whatever you want 
     });    


    });    
    } 
}