2016-08-31 16 views
8

defalarca Daha doğrusu bir selektör daha yönlendirici çıkışına diğer tarafında varolan bir alt bileşeni erişmek istediğiniz durumlarda çalışabilir: Ben bildiğimiz ViewChild işlevselliği ile@ViewChild() yöntemini veya yönlendirici çıkışlı benzer mi? Nasıl olur?

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

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

Bu çatışmalar, Yine de, bileşenimin, bir yönlendirici etiketinin içinde olduğu kadar kolay bir şekilde yönlendiricinin içinde ne olduğunu görebilmeli ve etkileşimde bulunabiliyor gibi görünmektedir.

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

Ama bu yanlış bir yoldur çünkü doğal olarak, çocuk tanımlanmamış:

Mesela ben bu çalıştı. Doğru bir yol var mı?

Verileri paylaşmak için bir hizmet kullanmaya çalışıyorum ama daha sonra bir hack olmadan ya da prod modunu etkinleştirerek düzeltmeyi umduğum bir "sorun kontrol edildikten sonra değişti" sorunuyla karşılaşıyorum.

+0

'@ ViewChild (RequestItemsComp) alt öğesini deneyebilirsiniz: RequestItemsComp;'. Çalışmasını beklemiyordum (denemedim) ama '@ ViewChild ('child')' sadece elemanın yöneltilmiş bileşenler için mümkün olmayan bir '# child' şablon değişkeni varsa çalışır. –

+0

Rotalar arasında veri paylaşmak için bir hizmet kullanın. "SetTimeout()" kullanarak "ifadesi kontrol edildikten sonra değişti" hatası etrafında çalışabilirsiniz. Bakınız https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview –

+0

@Methodician: Eklediğim çözümü kontrol ettiniz mi? Senin için çalıştın mı? –

cevap

20

Yönlendirici çıkışının içindeki örneklenen bileşenin referansını almak için etkinleştirme etkinliğine dokunabilirsiniz.

Yönlendirici çıkış activate olay yeni bir bileşen örneği olan her zaman yayacaktır RouterOutlet Docs

alıntı ve yok ediliyor copy olay.

örnek

İşte
@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!!'); 
    } 
} 

bu yardımcı olur Plunker!!

Umuttur !!

+0

Bu iyi uygulama mı? Hangi bileşenin etkinleştirildiğini öğrenmek için fazladan iş yapmak zorunda kalacaksınız? –

+1

ideal olarak, gereksinimlerinize bağlı olduğunu söyleyerek, bileşenler arasında etkileşim kurmak için hizmeti kullanırsınız. Alkış !! –

+0

Yani hizmetlere geri döndü, tamam teşekkürler! –

İlgili konular