Angular 방식으로 Angular2 경로에서 매개 변수를 얻는 방법은 무엇입니까?


84

노선

const appRoutes: Routes = [
    { path: '', redirectTo: '/companies/unionbank', pathMatch: 'full'},
    { path: 'companies/:bank', component: BanksComponent },
    { path: '**', redirectTo: '/companies/unionbank' }
]

구성 요소

const NAVBAR = [
    { 
        name: 'Banks',
        submenu: [
            { routelink: '/companies/unionbank', name: 'Union Bank' },
            { routelink: '/companies/metrobank', name: 'Metro Bank' },
            { routelink: '/companies/bdo', name: 'BDO' },
            { routelink: '/companies/chinabank', name: 'China Bank' },
        ]
    },
    ...
]

링크의 예 : http://localhost:8099/#/companies/bdo

위의 예제 링크에서 String bdo 를 얻고 싶습니다 .

window.location.href를 사용하여 링크를 얻고 배열로 분할 할 수 있다는 것을 알고 있습니다. 따라서 마지막 매개 변수를 얻을 수 있지만 각도 방식으로이를 수행하는 적절한 방법이 있는지 알고 싶습니다.

어떤 도움을 주시면 감사하겠습니다. 감사

답변:


194

업데이트 : 2019 년 9 월

몇몇 사람들이 언급했듯이의 매개 변수 paramMap는 공통 MapAPI를 사용하여 액세스해야합니다 .

매개 변수가 변경 되어도 상관없는 경우 매개 변수의 스냅 샷을 얻으려면 :

this.bankName = this.route.snapshot.paramMap.get('bank');

(일반적으로 라우터 탐색의 결과로) 매개 변수 값의 변경을 구독하고 알림을 받으려면

this.route.paramMap.subscribe( paramMap => {
    this.bankName = paramMap.get('bank');
})

업데이트 : 2017 년 8 월

Angular 4부터는 params새로운 인터페이스를 위해 더 이상 사용되지 않습니다 paramMap. 위의 문제에 대한 코드는 단순히 하나를 다른 것으로 대체하면 작동합니다.

원래 답변

ActivatedRoute컴포넌트에 삽입 하면 경로 매개 변수를 추출 할 수 있습니다.

    import {ActivatedRoute} from '@angular/router';
    ...
    
    constructor(private route:ActivatedRoute){}
    bankName:string;
    
    ngOnInit(){
        // 'bank' is the name of the route parameter
        this.bankName = this.route.snapshot.params['bank'];
    }

사용자가 다른 구성 요소로 먼저 이동하지 않고 은행에서 은행으로 직접 이동할 것으로 예상하는 경우 관찰 가능 항목을 통해 매개 변수에 액세스해야합니다.

    ngOnInit(){
        this.route.params.subscribe( params =>
            this.bankName = params['bank'];
        )
    }

두 문서의 차이점을 포함한 문서의 경우이 링크를 확인하고 " activatedroute "를 검색하십시오.


부모 구성 요소의 라우터 아웃렛에로드 된 구성 요소에 다른 ActiveRoute 매개 변수가 표시되는 제한이 있습니까?-부모가 매개 변수를 볼 수 있지만 포함 된 구성 요소가 동일한 매개 변수를 볼 수없는 경우가 발생했습니다.
Neoheurist

내 구성 요소의 공급자로 ActivatedRoute를 추가했기 때문에 작동하지 않았습니다. 그러니 그렇게하지 마십시오! 각도 4.2.4에서 매력처럼 작동합니다.
Thomas Webber

1
의 경우 대신 paramMap사용해야합니다 params.get('bank').
zurfyx

this.route.snapshot.paramMap.get('bank');과 의 차이점은 무엇입니까 this.route.snapshot.params.bank;?
Gil Epshtain

22

Angular 6+부터는 이전 버전과 약간 다르게 처리됩니다. @BeetleJuice가에 언급 된 바와 같이 위의 대답 , paramMap경로 PARAMS을 얻기를위한 새로운 인터페이스가 있지만 실행은 각도의 최신 버전에서 조금 다릅니다. 이것이 구성 요소에 있다고 가정합니다.

private _entityId: number;

constructor(private _route: ActivatedRoute) {
    // ...
}

ngOnInit() {
    // For a static snapshot of the route...
    this._entityId = this._route.snapshot.paramMap.get('id');

    // For subscribing to the observable paramMap...
    this._route.paramMap.pipe(
        switchMap((params: ParamMap) => this._entityId = params.get('id'))
    );

    // Or as an alternative, with slightly different execution...
    this._route.paramMap.subscribe((params: ParamMap) =>  {
        this._entityId = params.get('id');
    });
}

직접 페이지로드시 ID 매개 변수를 가져올 수 있고 관련 엔터티 간을 탐색하면 구독이 제대로 업데이트되기 때문에 둘 다 사용하는 것을 선호합니다.

Angular Docs의 소스


1
switchMap여기에 왜 필요합니까? 직접 페이지로드시에도 구독이 호출되지 않습니까?
분쇄

4
@crush 위에 링크 된 문서에서 : "RxJS map연산자 를 사용한다고 생각할 수 있습니다 .하지만 는를 HeroService반환합니다 Observable<Hero>. 따라서 switchMap연산자를 사용 하여 Observable을 평면화합니다 . switchMap연산자는 이전 기내 요청도 취소합니다. 사용자가 다음으로 다시 이동하면 새로운이 경로 id(가) 동안 HeroService여전히 이전을 검색하는 id, switchMap폐기 된 요청이 반환을위한 새로운 영웅이 id. "
KMJungersen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.