2017-02-03 3 views
0

Ich möchte einen Service haben, die eine beobachtbare Variable abhängig von der aktuellen URL haben.Erste Route-Parameter in Service

:programID     -- program overivew 
:programID/bug    -- bug list 
:programID/bug/:bugID  -- bug overview 

Wo programID an irgendeiner Stelle wechseln. Ich habe einen Dienst gemacht, dass von dem, was ich von angular docs verstanden, sollte eine beobachtbare mit Parametern machen

ProgramService: (Auszug)

currentProgramID: number 

constructor(
    private router: Router, 
    private route: ActivatedRoute, 
    private http: Http){ 

    this.route.params.subscribe((params: Params) => { 
     console.log('Parent:', params['programID']) 
    }) 

    this.route.children[0].params.subscribe((params: Params) => { 
     console.log('Childern:', params['programID']) 
     // Works if loaded while at url : 'abc123/bug/abc123' 
    }) 

    this.route.params.subscribe((params: Params) => { 
     console.log('Hacky?:', this.route.snapshot.params['programID']) 
    }) 
} 

Komponenten, die aktuelle Programm-Referenz benötigen: (Auszug)

program: Promise<program> 

constructor(
    private programService: ProgramService, ...){} 

ngOnInit() { 
    this.program = this.programService.getProgram(/*current program*/) 
    ... 
} 

Allerdings bekomme ich nur die programID einmal, und das, wenn die Seite mit der richtigen URL geladen wird. Ich komme nicht einmal nach der Navigation.

Danach werde ich zu switchMap wechseln, aber zu Testzwecken war dies mehr vorhanden.

Antwort

1

Sie können router.events und router.routerState.snapshot.root.firstChild verwenden die params zu lesen:

@Injectable() 
class ProgramService { 
    programId:string; 
    constructor(
    private router: Router, 
    //private http: Http 
    ){ 

    this.router.events 
    .filter(e => e instanceof NavigationEnd) 
    .forEach(e =>{ 
     var firstChild = router.currentRouterState.snapshot.root.firstChild; 
     console.log(firstChild.params); 
     console.log(firstChild.firstChild && firstChild.firstChild.firstChild && firstChild.firstChild.firstChild.params); 
     var newProgramId = firstChild.params['programID']; 
     if(this.programId != newProgramId) { 
     this.programId = newProgramId; 
     this.programService.getProgram(this.programId); 
     } 
    }); 

Plunker example

+0

Das ist wahr, aber warum nicht die beobachtbare nicht feuern? Und fügt die Option Params manually only hinzu? – Akxe

+1

Der Service wird nur einmal erstellt. Routed-Komponenten werden jedes Mal erstellt, wenn die App zur Route für diese Komponente navigiert. Aus diesem Grund erhält der Dienst die 'ActivatedRoute' nur einmal injiziert. Wenn Sie das nächste Mal zu dieser Route navigieren, wird eine neue "ActivatedRoute" -Instanz erstellt, aber der Dienst enthält immer noch die alte (außer, wenn der Dienst in '@Component()' der gerouteten Komponente bereitgestellt wird, deshalb das Observable feuern nicht, weil es alt ist –

+0

Alternativ können Sie den Dienst zu gerouteten Komponenten injizieren und die Komponenten die Parameter an den Dienst übergeben, anstatt den Dienst selbst zu erwerben.Ich habe keine tiefen Kenntnisse über den Router, dort Andere Möglichkeiten, die mir nicht bekannt sind: –

Verwandte Themen