2016-03-28 11 views
12

मेरे पास परिवर्तन पहचान के बारे में एक साधारण सवाल है।कोणीय 2 घटक सेवा में परिवर्तन सुनने के लिए

मेरे पास एक बूलियन के साथ एक घटक और एक (वैश्विक) सेवा है। मैं उस बूलियन को घटक कैसे सुन सकता हूं और उस बूलियन में परिवर्तन करने पर फ़ंक्शन निष्पादित कर सकता हूं?

धन्यवाद!

+2

देखें https://angular.io/docs/ts/latest/cookbook/component-communication.html: मैं बस को जोड़ने के लिए आप भी एक टाइपप्रति सेटर का लाभ उठाने के लिए स्वचालित रूप से परिवर्तन के लिए घटना को गति प्रदान करने सकता है कि चाहेगा #! # बिडरेक्शनल-सेवा –

+0

संकेत के लिए अच्छा धन्यवाद! –

+0

@MarkRajcok साझा करने के लिए धन्यवाद! कोणीय 2 दस्तावेज़ वास्तव में साथ आ रहे हैं ... मुझे नहीं पता था कि उनके पास इस तरह का उदाहरण था। –

उत्तर

17

इस बूलियन में परिवर्तन के आधार पर आप इसे अपनी सेवा पर Observable<boolean> के रूप में बेनकाब कर सकते हैं और फिर अपने घटक में उस स्ट्रीम की सदस्यता ले सकते हैं। आपकी सेवा कुछ ऐसा दिखाई देगा:

@Component({...}) 
export class MyComponent { 
    currentBool: boolean; 

    constructor(service: MyBooleanService) { 
     service.myBool$.subscribe((newBool: boolean) => { this.currentBool = newBool; }); 
    } 
} 

अब आप कि bool मूल्य के साथ क्या करने की जरूरत पर निर्भर करता है कि आप कुछ करने की जरूरत है हो सकता है:

@Injectable() 
export class MyBooleanService { 
    myBool$: Observable<boolean>; 

    private boolSubject: Subject<boolean>; 

    constructor() { 
     this.boolSubject = new Subject<boolean>(); 
     this.myBool$ = this.boolSubject.asObservable(); 
    } 

    ...some code that emits new values using this.boolSubject... 
} 

फिर अपने घटक में आप कुछ इस तरह होता है अन्य चीजों को अपडेट करने के लिए अपने घटक को प्राप्त करने के लिए, लेकिन यह एक अवलोकन योग्य का उपयोग करने का सारांश है।

एक और विकल्प यह है कि आप अपने टेम्पलेट के भीतर एसिंक पाइप का उपयोग कन्स्ट्रक्टर में स्ट्रीम की स्पष्ट रूप से सदस्यता लेने के बजाय करते हैं। फिर भी, यह इस बात पर निर्भर करता है कि आपको बूल मूल्यों के साथ वास्तव में क्या करना है।

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद !! –

+2

आप rxjs से विषय प्राप्त कर सकते हैं –

+0

** UserService.ts ** 'this._dataService.get (this._userUrl) .subscribe (उपयोगकर्ताओं => { self.user = Enumerable.from (उपयोगकर्ता) .firstOrDefault (ई => e.Email == उपयोगकर्ता नाम && पासवर्ड == "1234"); अगर (!! self.user) { self._isLoggedInSubject.next (सही); } }); ' ** घटक ** 'isLoggedIn: बूलियन; कन्स्ट्रक्टर (निजी _user सेवा: उपयोगकर्ता सेवा) { यह ._userService.isLoggedIn.subscribe ((प्रतिक्रिया: बूलियन) => this.isLoggedIn = प्रतिक्रिया); } ' ने मेरे लिए काम नहीं किया – nadav

10

सैम का उत्तर पूरी तरह से सही है।

@Injectable() 
export class MyBooleanService { 
    myBool$: Observable<boolean>; 

    private boolSubject: Subject<boolean>; 

    constructor() { 
     this.boolSubject = new Subject<boolean>(); 
     this.myBool$ = this.boolSubject.asObservable(); 
    } 

    set myBool(newValue) { 
     this._myBool = newValue; 
     this.boolSubject.next(newValue); 
    } 
} 
+4

हाय, यह '_.myBool' कहां से आया है? इसे खेद नहीं है – Lloople

+0

यह सेवा पर एक निजी बूलियन माना जाता है, वह बस इसे अपने नमूना कोड में शामिल करना भूल गया। –

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