2

현재 앵귤러 2에서 사용할 수있는 새로운 라우터 3.0 알파를 가지고 놀기 위해 사용하고있는 작은 플 런크가 있습니다. 일반적으로 잘 작동하지만 문제는 특정 ID로 '세부 정보'구성 요소로 연결되는 링크를 클릭하면 다른 ID로 다른 링크를 클릭해도 변경되지 않는다는 것입니다. 구성 요소는 절대 다시 인스턴스화되지 않으므로 처음로드 될 때 전달 된 내용 만 표시됩니다.Angular2 구성 요소가 라우팅 매개 변수 업데이트 (라우터 3.0)를 감지하지 못합니다.

import { Component, OnInit } from '@angular/core'; 
import { ActivatedRoute } from '@angular/router'; 
import { ContactsService } from './contacts.service'; 

@Component({ 
    selector: 'contacts-detail', 
    template: ` 
    <h2>{{contact.name}}</h2> 
    ` 
}) 
export class ContactsDetailComponent implements OnInit { 

    constructor(private contactsService: ContactsService, private route: ActivatedRoute) { 
    } 

    ngOnInit() { 
    this.contact = this.contactsService.getContact(this.route.snapshot.params.id); 
    console.log('Fetching user', this.route.snapshot.params.id); 
    } 
} 

Here is the Plunk 문제를 시연 :

여기에 문제의 구성 요소입니다. 한 저자 이름을 클릭하고 다른 저자 이름을 클릭하면 변경되지 않습니다. 당신의 ContactsDetailComponent에서

답변

8

이에 OnInit을 변경

ngOnInit() { 
    this.sub = this.route.params.subscribe(params => { 
    let id = +params['id']; 
    this.contact = this.contactsService.getContact(id); 
    }); 
    } 

이 쿵하는 소리에 나를 위해 일했다.

+0

확실히 저에게는 효과적이지만 이상하게 보입니다. 그래도 다른 방법이 없다면 이걸로 갈거야. 시간을내어 답변 해 주셔서 대단히 감사합니다. –

+0

이상하지는 않지만 구성 요소를 다시 사용합니다. – TDaver

+0

@TDaver 다음 단어 선택을 변경하겠습니다. 그것은 전혀 분명하지 않습니다. ngOnReload 인터페이스와 같은 것을 찾았지만 아무 것도 발견하지 못했습니다. 그것은해야 할 일을하는 더 Angular2'ish 방법처럼 보일 것입니다. –

1

여기에 사용할 수있는 여러 개의 lifeCycle 후크가있는 것으로 보입니다. 나는 아래에서 볼 수 있듯이 DoCheck 인터페이스를 사용하고 구성 요소 클래스에서 ngDoCheck() 메서드를 구현하여 원하는 동작을 얻을 수있었습니다.

import { Component, DoCheck } from '@angular/core'; 
import { ActivatedRoute } from '@angular/router'; 
import { ContactsService } from './contacts.service'; 

@Component({ 
    selector: 'contacts-detail', 
    template: ` 
    <h2>{{contact.name}}</h2> 
    ` 
}) 
export class ContactsDetailComponent implements AfterViewChecked, DoCheck { 

    constructor(private contactsService: ContactsService, private route: ActivatedRoute) { 
    } 

    ngDoCheck() { 
    this.contact = this.contactsService.getContact(this.route.snapshot.params.id); 
    } 
} 

Here's a plunk 업데이트 된 코드.

나는 이것을 사용하는 것이 가장 좋고/올바른 라이프 사이클 고리라고 확신하지는 않습니다. 아마도 Router에서 사용할 수있는 몇 가지 종류의 고리가 있습니다.

+0

흥미로운 접근 방법입니다 (분명히 작동합니다). 문서의 약간에서'DoCheck'가 있습니다. 지시어와 함께 사용되는 것 같습니다. snapshot과 observable의 매개 변수 값을 얻는 것이 유리한가요? –

+0

@ R. 리차드 이것이 올바른 것이 확실하지 않습니다. 필자는 입력 필드의 모든 키 스트로크에서 발생하는'@ Input' 변수와'ngDoCheck()'메소드에 연결된 컴포넌트의 양식 필드로 테스트를 수행했습니다. 이는 분명히 우리가 정말로 원하는 것은 아닙니다. 거기에 뭔가가 있어야한다는 느낌이 들었지만, 새로운 라우터가 사람들이 당신이 대답 할 때처럼 이런 유형의 상황을 처리 할 것으로 기대한다고 언급 한 기사 (공식적이 아님)를 보았습니다. –

+1

와우. 감사합니다 @ 마이클 오릴 !! 커피 한 잔 사주세요.저는 값 중 하나가 변경 될 때 그리고 거의 완전히 포기한 많은 시도 후에 자체 구성 요소 중 하나를 새로 고치려고 노력했습니다. 제안한대로 ngDoCheck() 메서드를 구현하려고 시도했지만 이제는 제대로 작동합니다. 비올라. 몇 시간의 좌절감이 이제 막 끝났다. – b0rgBart3

0

또 다른 방법은이 작업을 수행합니다 :

ngOnInit() { 
    this.route.params.forEach((params: Params) => { 
     let id = +params['id']; 
     this.contact = this.contactsService.getContact(id); 
    }); 
} 

는 여기에 관찰 가능한에서 경로 PARAMS를 검색 할 수 있습니다. Observable over Snapshot을 사용하면 구성 요소를 다시 인스턴스화하지 않고 재사용 할 수 있다는 장점이 있습니다. 이것은 Angular 2.0 최종 문서에 따라 권장되는 방법입니다.