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.
Das ist wahr, aber warum nicht die beobachtbare nicht feuern? Und fügt die Option Params manually only hinzu? – Akxe
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 –
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: –