2016-11-17 13 views
5

क्या मेरे घटक दिखाई देने पर अंगुलर 2 में कोई ईवेंट निकाला गया है? इसे एक टैबcontrol में रखा गया है और जब उपयोगकर्ता स्विच करता है तो मैं अधिसूचित होना चाहता हूं, मैं अपने घटक को किसी ईवेंट को आग लगाना चाहता हूं।घटना जब घटक दिखाई देता है

+0

यदि यह एक टैब नियंत्रण है जिसे आपने कार्यान्वित किया है, तो निश्चित रूप से आप एक ईवेंट एमिटर जोड़ सकते हैं और उसी स्थान पर उत्सर्जित कर सकते हैं जहां आप टैब बदलते हैं? – Seer

+0

वैसे मैं प्राइमेंग के टैब नियंत्रण का उपयोग करता हूं, और अस्तित्व में आने वाली एकमात्र घटना को बदलाव से पहले बुलाया जाता है, इसलिए इस समय नियंत्रण अभी तक दिखाई नहीं दे रहा है :( – Shimrod

उत्तर

3

मैंने आखिरकार क्या किया (जो बहुत सुंदर नहीं है लेकिन काम करता है जबकि मेरे पास ऐसा करने का बेहतर तरीका नहीं है ...) ngAfterContentChecked() कॉलबैक का उपयोग करना और परिवर्तन को स्वयं संभालना है।

@ViewChild('map') m; 
private isVisible: boolean = false; 
ngAfterContentChecked(): void 
{ 
    if (this.isVisible == false && this.m.nativeElement.offsetParent != null) 
    { 
     console.log('isVisible switched from false to true'); 
     this.isVisible = true; 
     this.Refresh(); 
    } 
    else if (this.isVisible == true && this.m.nativeElement.offsetParent == null) 
    { 
     console.log('isVisible switched from true to false'); 
     this.isVisible = false; 
    } 
} 
5

आप ngAfterViewInit() कॉलबैक

https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html

+0

यह मेरी ज़रूरतों को पूरा नहीं करता है, मैंने इस कॉलबैक के अंदर एक लॉग रखा , और इसे केवल एक बार बुलाया जाता है (भले ही मेरा घटक दिखाई दे या न हो) – Shimrod

+3

कोणीय को यह जानने का कोई तरीका नहीं है कि कोई घटक दिखाई दे रहा है अगर यह किसी अन्य डोम तत्व के पीछे छिपा हुआ है .. यदि आप '* ngIf =" का उपयोग करते हैं "'दिखाने/छिपाने के लिए, तब टैब को चुना जाता है या अचयनित किया जाता है, फिर' ngAfterViewInit()' हर बार कहा जाता है। –

1

उपयोग कर सकते हैं ऐसा कोई घटना है, लेकिन आप एक टैब नियंत्रण का उपयोग कर रहे हैं, उचित तरीके से यह करने के लिए के लिए एक टैब परिवर्तन @Output बनाने के लिए किया जाएगा यदि आपका कस्टम नियंत्रण है, तो अन्य टैब नियंत्रण (जैसे ng-bootstrap) में कुछ टैब परिवर्तन ईवेंट भी हैं।

यदि आपके घटक को इसके बारे में पता होना चाहिए, तो आप यह टैब बदलने के लिए इस टैब परिवर्तन ईवेंट का उपयोग कर सकते हैं, और यदि आपको पता है कि कौन सा टैब दिखाई दे रहा है, तो आप यह भी जानते हैं कि आपका घटक दिखाई दे रहा है या नहीं। तो अगर आप कुछ इस तरह कर सकते हैं:

onTabChange(event) { 
    this.currentTab = /** Get current tab */; 
} 

और फिर आप यह अपने आप में अपने घटक को भेज सकते हैं अगर आप एक निवेश है:

@Input() activated: boolean = false; 

और फिर आप के साथ इसे लागू कर सकते हैं:

<my-component [activated]="currentTab == 'tabWithComponent'"></my-component> 

अब आप OnChanges को देख सकते हैं कि मॉडल मान activatedtrue पर बदल गया है या नहीं।


तुम भी एक Observable इस तरह के साथ एक सेवा का उपयोग करने के लिए इस refactor कर सकते हैं:

@Injectable() 
export class TabService { 
    observable: Observable<any>; 
    observer; 

    constructor() { 
    this.observable = Observable.create(function(observer) { 
     this.observer = observer; 
    }); 
    } 
} 

एक घटक इन परिवर्तनों को सुनने के लिए चाहता है, यह tabService.observable की सदस्यता ले सकते। जब आपका टैब बदलता है, तो आप tabService.observer.next() के साथ नई वस्तुओं को धक्का दे सकते हैं।

+0

यह एक अच्छा विचार है, हालांकि मुझे यह नहीं लगता कि यह मेरे मामले में काम करता है क्योंकि टैब नियंत्रण मैं उपयोग करता हूं प्राइमेंग से है और वे केवल टैब परिवर्तन पर एक ईवेंट प्रदान करते हैं _before_ टैब वास्तव में बदल गया है => मेरा घटक इस समय दिखाई नहीं दे रहा है ... – Shimrod

संबंधित मुद्दे