2016-08-31 1 views
8

나는 반복해서 내가 오히려 선택보다 라우터 콘센트의 반대편에 존재하는 하위 구성 요소에 액세스하고 싶은 상황으로 실행 : 나는 그것을 알고있는 ViewChild 기능을 가진@ViewChild() 또는 유사품을 라우터 콘센트와 함께 사용할 수 있습니까? 만약 그렇다면?

Like: 
<router-outlet></router-outlet> 

NOT: 
<selector-name></selector-name> 

이 충돌, 그럼에도 불구하고 내 구성 요소가 셀렉터 태그 안에있는 것과 마찬가지로 쉽게 라우터 콘센트 내부에있는 것을보고 상호 작용할 수 있어야합니다.

export class RequestItemCatsComp { 
    @ViewChild('child') child: RequestItemsComp; 
    ***etc...*** 
ngAfterViewInit() { 
    if (this.child) // Always child is undefined 
     this.groupId = this.child.groupId; 
    } 
} 

그러나 이것은 잘못된 방법이기 때문에 자연스럽게 아이가 정의되지 않는다 :

는 예를 들어 나는이 시도. 올바른 방법이 있습니까?

서비스를 사용하여 데이터를 공유하려고하지만 "확인한 후에 표현식이 변경되었습니다"라는 해킹 문제없이 다른 문제가 발생합니다. 해킹이나 개선 모드를 사용하지 않고 해결할 수 있기를 바랍니다.

+0

'@ViewChild (RequestItemsComp) child : RequestItemsComp;를 시도해 볼 수 있습니다. 작동하지 않을 것이라고 기대했지만'@ViewChild ('child')'는 요소에 라우트 된 구성 요소에서 사용할 수없는 템플릿 변수'# child '가있는 경우에만 작동합니다. –

+0

서비스를 사용하여 경로간에 데이터를 공유합니다. 'setTimeout()'을 사용하여 "확인 된 후에 표현이 변경되었습니다"라는 오류를 해결할 수 있습니다. https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview –

+0

@Methodician : 내가 추가 한 솔루션을 확인 했습니까? 너에게 효과가 있었 니? –

답변

20

이벤트를 활성화하면 라우터 콘센트에서 인스턴스화 된 구성 요소에 대한 참조를 얻을 수 있습니다.

라우터 출구 activate 이벤트에 새로운 요소 가 인스턴스화 될 때마다 발광 할 RouterOutlet Docs

발췌하고 파괴 을중인 비활성화 이벤트.

예는

다음
@Component({ 
    selector: 'my-app', 
    template: `<h3 class="title">Basic Angular 2</h3> 
    <router-outlet (activate)="onActivate($event)" ></router-outlet> 
    ` 
}) 
export class AppComponent { 
    constructor(){} 

    onActivate(componentRef){ 
    componentRef.sayhello(); 
    } 
} 

@Component({ 
    selector: 'my-app', 
    template: `<h3 class="title">Dashboard</h3> 
    ` 
}) 
export class DashboardComponent { 
    constructor(){} 

    sayhello(){ 
    console.log('hello!!'); 
    } 
} 

이 도움이 Plunker!!

희망입니다!

+0

좋은 방법입니까? 어떤 구성 요소가 활성화되었는지 확인하려면 추가 작업을해야합니까? –

+1

이상적으로는 서비스를 사용하여 구성 요소 간의 상호 작용이 이루어지며 요구 사항에 따라 달라집니다. 건배!! –

+0

그래서 서비스로 돌아 왔습니다 ... 감사합니다! –

관련 문제