2017-02-03 4 views
0

Я хотел бы иметь сервис, который имеет видимый переменный, зависящий от текущего URL.Получить первый параметр маршрута в службе

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

Где programID может переключаться в любой момент. Я сделал услугу, что от того, что я понял из angular docs, должна наблюдаемого с параметрами

ProgramService: (экстракт)

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

компонента, которые нуждаются в текущей ссылке программы: (экстракт)

program: Promise<program> 

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

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

Однажды я получаю только programID, и когда страница загружается с правильным URL. Я даже не получаю, если после навигации.

Впоследствии я переключусь на switchMap, но для целей тестирования это было больше на месте.

ответ

1

Вы можете использовать router.events и router.routerState.snapshot.root.firstChild прочитать params:

@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

Это верно, но почему бы не наблюдаемым не вспылить? И добавляет параметр Params вручную только? – Akxe

+1

Услуга создается только один раз. Маршрутизированные компоненты создаются каждый раз, когда приложение переходит к маршруту для этого компонента. Вот почему служба получает «ActivatedRoute», введенную только один раз. При следующем переходе к этому маршруту создается новый экземпляр «ActivatedRoute», но служба по-прежнему содержит старую (за исключением случаев, когда служба предоставляется в '@Component()' маршрутизируемого компонента, поэтому наблюдаемая не работает, потому что он устарел. –

+0

В качестве альтернативы вы можете ввести услугу маршрутизируемым компонентам и заставить компоненты передавать параметры службе, а не обслуживать ее самостоятельно. У меня нет глубоких знаний о маршрутизаторе, там может быть другими способами, о которых я не знаю. –

Смежные вопросы