2016-02-21 16 views
13

मेरे पास एक प्रमाणीकरण सेवा है जो प्रमाणित चर को सत्य या गलत के बराबर बनाती है।कोणीय 2 - सेवा परिवर्तनीय परिवर्तनों की सदस्यता लें

checkAuthentication(){ 
    this._authService.getAuthentication() 
    .subscribe(value => this.authenticated = value); 
} 

मैं कैसे एक समारोह जब this.authenticated मूल्य बदल गया है पर अमल करते हैं? ngOnChanges परिवर्तन नहीं उठा रहा है।

उत्तर

19

सेवा में authenticated रखने के लिए और घटकों के बीच यह साझा करने के लिए आप BehaviorSubject उपयोग कर सकते हैं, यह अलग अलग स्थानों में प्रमाणीकरण की जाँच करने के value है, और यह परिवर्तन पर प्रतिक्रिया करने के लिए subscribe() विधि है ...

class AuthService { 
    public authenticated = new BehaviorSubject(null); 
    getAuthentication() { 
    this._http.get('/authenticate') 
     .map(response => response.json()) 
     .map(json => Boolean(json)) // or whatever check you need... 
     .subscribe((value: boolean) => this.authenticated.next(value)) 
    } 
} 

class Component { 
    constuctor(private _authService: AuthService) { 
    // Only check once even if component is 
    // destroyed and constructed again 
    if (this._authService.authenticated.value === null) 
     this._authService.getAuthentication(); 
    } 

    onSubmit(){ 
    if (!this._authService.authenticated.value) 
     throw new Error("You are authenticated!") 
    } 
} 

कैसे क्या मैं एक फ़ंक्शन निष्पादित करता हूं जब this.authenticated ने मूल्य बदल दिया है?

this._authService.authenticated 
    .subscribe((value: boolean) => console.log(value)) 
+0

हाय @ सस्क्सा तो अगर मेरे पास उदा। 5 घटक 'home.component.ts',' footer.component.ts', 'navbar.component.ts',' x.component.ts', और 'user.component.ts'। इन 5 घटकों को मानते हुए, और यदि मैं प्रमाणीकृत की जांच करना चाहता हूं। मुझे निम्नलिखित इंजेक्ट करना होगा: 'मेरे सभी 5 घटकों के लिए कन्स्ट्रक्टर (निजी _authService: AuthService) {...}'। क्या ये सही है? और सभी 5 घटकों के लिए 'ngOnInit' करें?Angular2 प्रमाणीकरण अवधारणा को समझने के लिए कुछ मदद की ज़रूरत है। –

+1

कई विकल्प/विकल्प हैं .. यह सब कुछ आप क्या कर रहे हैं पर निर्भर करता है। आप प्रत्येक घटक, या रूट घटक पर प्रमाणित कर सकते हैं। यह एक जटिल विषय है, आपको यह तय करना होगा कि आपके ऐप के लिए सबसे अच्छा क्या है (; – Sasxa

+0

क्या आप मुझे इस विषय पर चर्चा/मंच/ब्लॉग/आलेख पर इंगित कर सकते हैं? –

9

मुझे लगता है कि आप टाइपप्रति की प्राप्त/सेट वाक्य रचना का लाभ उठाने सकता है कि पता लगाने के लिए जब अपने सेवा के अपने प्रमाणीकृत संपत्ति अद्यतन किया जाता है:

private _authenticated:Boolean = false; 
    get authenticated():Boolean { 
     return this._authenticated ; 
    } 
    set authenticated (authenticated Boolean) { 
    // Plugin some processing here 
     this._ authenticated = authenticated; 
    } 

जब एक मूल्य, "प्रमाणीकृत सेट बताए "ब्लॉक कहा जाता है। इस तरह के कोड के साथ उदाहरण के लिए:

this.authenticated = true; 

अधिक जानकारी के लिए इस सवाल का देखें:

कहा कि तुम भी सेवा में EventEmitter संपत्ति का लाभ उठाने सकता है। जब प्रमाणीकृत संपत्ति अपडेट की जाती है, तो इसी घटना को निकाल दिया जा सकता है।

export class AuthService { 
    authenticatedChange: Subject<boolean> = new Subject(); 

    constructor() {} 

    emit(authenticated) { 
    this.authenticatedChange.next(authenticated); 
    } 

    subscribe(component, callback) { 
    // set 'this' to component when callback is called 
    return this.authenticatedChange.subscribe(data => { 
     callback(component, data); 
    }); 
    } 
} 

अधिक जानकारी के लिए इस लिंक देखें:

+0

क्या यह सही तरीका है, क्योंकि आप 'प्रमाणीकृत' मूल्य निर्धारित करते समय कुछ घटनाओं को आग लगाने का सुझाव दे रहे हैं? आदर्श रूप से सेटटर के लिए ज़िम्मेदार हैं प्रदान किए गए इनपुट मूल्य को उसके फ़ंक्शन में जोड़कर मूल्य निर्धारित करना .. –

+0

हाय थियरी, मैंने Eventular.io साइट पर EventEmitter पर दस्तावेज़/ट्यूटोरियल के लिए खोज की। लेकिन यह काफी सीमित था। कोई विचार जहां मैं Angular2 EventEmitter का उपयोग करने पर निर्देशित ट्यूटोरियल पा सकता हूं? –

+1

इसे खराब अभ्यास माना जाता है। विषय/व्यवहार का उपयोग करने के लिए अनुशंसित दृष्टिकोण विषय – atsituab

0

यह जो घटना को संभालने के लिए की जरूरत है पर निर्भर करता है। यदि यह माता पिता के घटक है, तो आप उत्पादन घटना बाइंडिंग का लाभ उठाने कर सकते हैं:

@Output authenticationChange: EventEmitter<Boolean> = new EventEmitter(); 
checkAuthentication(){ 
    this._authService.getAuthentication() 
    .subscribe(value => 
      if(value != this.authenticated) { 
       this.authenticated = value); 
       this.authenticationChange.emit(value); 
     }); 
} 

और अपने माता पिता के घटक में:

<directive (authenticationChange)="doSomething()"> 
-2

मैं घटक टेम्पलेट में एक {{ showValue() }} इस्तेमाल किया, और में .ts फाइल मैं बुलाया सेवा के चर

showValue() { 
    this.authenticated = this._authService.authenticated; 
    return "dummy" 
} 

कोणीय 2 के जीयूआई 2-रास्ता बाध्यकारी के लिए धन्यवाद, यह काम करता है।

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