2016-02-12 10 views
6

मुझे कोई समस्या है जहां EventEmitter मूल घटक के मान को आउटपुट नहीं करता है। यहां बताया गया है कि मैं कैसे सेटअप कर रहा हूं।कोणीय 2 EventEmitter

main.component.ts (लघु संस्करण)

...  

@Component({ 
selector: 'my-app', 
templateUrl: '/app/views/main.ejs', 
directives: [ROUTER_DIRECTIVES], 
providers:[AuthService], 
inputs:['userLoggedIn'] 
}) 

@RouteConfig([ 
{path:'/logout', name: 'Logout', component: AuthComponent}, 

]) 

export class AppComponent implements OnInit, CanReuse{ 

    constructor(private _auth_service: AuthService){ 

     this._auth_service.authChanged.subscribe(data=>this.authChangedHandler(data)); 

    } 

    public authChangedHandler($event){ 

     alert($event); 

    } 

} 

... 

auth.component.ts (लघु संस्करण)

export class AuthComponent implements OnInit, CanReuse{ 

public loggedIn = false; 

public user = {}; 

@Output() 
authChanged: EventEmitter<string>; 

public selectedTab = "/login"; 

    constructor(private _router: Router, private _location:Location,private _http: Http, private _auth_service: AuthService){ 

     this.authChanged = new EventEmitter(); 

     this.authChanged.emit("authChanged"); 

    } 

} 

main.ejs (लघु संस्करण)

<nav (authChanged)="authChangedHandler($event)"></nav> 
<router-outlet></router-outlet> 
,210

auth.service.ts

export class AuthService { 

public authChanged: EventEmitter<string>; 

constructor(private _http: Http){ 

    this.authChanged = new EventEmitter(); 
    this.authChanged.emit("authChanged"); 

    } 

} 

संपादित करें: मैं AuthService कोड है जो मैं मुख्य घटक में इंजेक्षन जोड़ लिया है। यह अब काम करना चाहिए लेकिन नहीं करता है।

+0

क्या आपको इसके लिए समाधान मिला? मैं @RouteConfig – Sanjeev

+0

@Sanjeev हां में जोड़े गए घटक से उत्सर्जित एक ईवेंट को भी कैप्चर करना चाहता हूं। मैंने सेवा कार्यक्रमों का उपयोग किया। मैंने यहां एक प्लंकर बनाया है (https://plnkr.co/edit/WZ5HbvBP5LMSqZQtixoG?p=preview) – xmaestro

+0

विचार बूटस्ट्रैप पर एक सेवा इंजेक्ट करना है और उस सेवा में ईवेंटमेटर होगा जिसमें प्रत्येक घटक वैश्विक रूप से सदस्यता ले सकता है। – xmaestro

उत्तर

14

EventEmitter द्वारा उत्सर्जित घटनाएं बबल नहीं होती हैं। यदि तत्व router-outlet में जोड़ा गया है तो केवल router-outlet ईवेंट प्राप्त करता है लेकिन router-outlet युक्त तत्व नहीं है।

आप माता-पिता और बच्चे तत्व के बीच संवाद करने के लिए साझा सेवा का उपयोग कर सकते हैं।

साझा सेवा के लिए

देखते हैं कि आप माता-पिता घटक के providers: [] सूची में साझा सेवा पंजीकृत करते हैं, सेवा केवल पेरेंट तत्व के बीच साझा किया जाता है और इसके सभी वंशज। यदि आप इसे केवल bootstrap(MyApp, [ ..., SharedService]) पर जोड़ते हैं तो संपूर्ण एप्लिकेशन एक उदाहरण साझा करता है।

+0

क्या आप साझा सेवा के बारे में अधिक विस्तृत जानकारी दे सकते हैं? शायद कुछ कोड? – xmaestro

+0

हां मैंने देखा और मैंने सेवा घटनाओं का चयन किया और उपरोक्त कोड में परिवर्तन किए। कृपया मेरे संपादन देखें। – xmaestro

+0

यदि आप 'AuthService' के निर्माता में ईवेंट को उत्सर्जित करते हैं तो ईवेंट 'AppComponent' सदस्यता लेने से पहले भेजी गई घटना है। परीक्षण के लिए 'एपसाइट सेवा 'में' एट्स सेवा 'में' emit (event)' को 'AppTomponent' सदस्यता लेने के लिए' को लपेटें। एक वास्तविक दुनिया के आवेदन में यह बाद में आग लग जाएगा। –

1

वास्तव में, navAuthComponent एक का मूल घटक नहीं है। उत्तरार्द्ध रूटिंग में शामिल है (router-outlet देखें)। यही कारण है कि आप HTML में nav तत्व पर पंजीकृत अभिव्यक्ति के लिए ईवेंट प्राप्त नहीं कर सकते हैं।

+0

कृपया मेरे संपादन देखें। 'Nav' मुद्दा अब से कोई फर्क नहीं पड़ता क्योंकि मैं सेवा ईवेंट का उपयोग कर रहा हूं। ? – xmaestro

+0

हां, लेकिन आपको इसका उपयोग करना चाहिए: 'this._auth_service.authChanged.emit (' authChanged '); ';-) घटना को ट्रिगर करने के लिए ... –

+0

लेकिन मैं इसे सेवा से छोड़ देता हूं। घटक से नहीं। – xmaestro