2017-02-28 13 views
9

शायद मुझे कुछ याद आ रहा है। मुझे पर्यवेक्षक और इसके वाक्यविन्यास के लिए एक सरल ट्यूटोरियल नहीं मिल रहा है। मैं कोणीय के साथ काम कर रहा हूं, मुझे एक सेवा से एक फ़ंक्शन (एक घटक में परिभाषित) कॉल करने की आवश्यकता है। मैंने यह solution पढ़ा। लेकिन मैं यह नहीं समझ सकता कि सेवा में बनाए गए अवलोकन में मूल्य को कैसे बदला जाए (शायद सृजन सबसे अच्छा तरीका नहीं है)।टाइपस्क्रिप्ट कोणीय - अवलोकन: इसके मूल्य को कैसे बदला जाए?

मैं समाधान में की तरह एक घटक है:

@Component({ 
    selector: 'my-component', 
    ... 
)} 
export class MyComponent { 
    constructor(myService:MyService) { 
    myService.condition.subscribe(value => doSomething(value)); 
} 

doSomething(value) { 
    if (value) // do stuff 
    else // other stuff 
} 

}

और यह मेरा सेवा है:

import { Injectable } from '@angular/core'; 
import { Observable} from 'rxjs/Observable'; 

@Injectable() 

export class MyService { 
    private condition: Observable<boolean>; 
    constructor() { 
     this.condition= new Observable(ob => {ob.next(false); }) 
     // maybe ob.next is not the best solution to assign the value? 
    } 

    change() {// how can i change the value of condition to 'true', to call 
       // the doSomething function in the component?? 
    } 

} 
+0

मैं मुसीबत बिल्कुल निकालने क्या आप क्या करना चाहते हो रही है। क्या आप अपनी समस्या के लिए थोड़ा और संदर्भ दे सकते हैं? आप (सोचते हैं) आप एक सेवा से एक घटक समारोह क्यों कॉल करना चाहते हैं? एक पर्यवेक्षक एक वादा की तरह है: आम तौर पर एक घटक में उपयोग किया जाता है, जब आप कुछ एसिंक ऑपरेशन पूरा करते हैं, और उस पर कार्य करते हैं, तो सभी एक घटक (या किसी अन्य सेवा) से कार्य करते हैं, तो आप सेवा को अवलोकन करने के लिए कहते हैं। – msanford

+0

अन्य प्रश्न जो आप दो घटक के बीच मध्यस्थों के रूप में सेवाओं का उपयोग करने से संबंधित हैं। क्या आप यही करना चाहते हैं? – msanford

+0

क्या यह condition = Observable.of (झूठा) 'आपके लिए काम करेगा? – msanford

उत्तर

4

टिप्पणियों से my other answer पर (संरक्षित के बाद से यह किसी के लिए उपयोगी हो सकता है), तो आप कुछ समय की शक्ति से अधिक मूल्यों फेंकना लाभ उठाने के लिए चाहते करने लगते हैं।

डॉमज़ प्रस्तावित के रूप में, विषय का उपयोग करें, लेकिन यहां एक (छोटा) उदाहरण है दिखा रहा है कि आप ऐसा कर सकते हैं। यद्यपि स्पष्ट रूप से some pitfalls to avoid in using Subject directly हैं, मैं इसे आपके पास छोड़ दूंगा।

import { Component, NgModule } from '@angular/core' 
import { BrowserModule } from '@angular/platform-browser' 
import { Observable, Subject } from 'rxjs/Rx'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Open the console.</h2> 
    </div> 
    `, 
}) 
export class App { 

    constructor() {} 

    let subject = new Subject(); 

    // Subscribe in Component 
    subject.subscribe(next => { 
    console.log(next); 
    }); 

    setInterval(() => { 
    // Make your auth call and export this from Service 
    subject.next(new Date()) 
    }, 1000) 
} 

@NgModule({ 
    imports: [ BrowserModule ], 
    declarations: [ App ], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 

Plunker

मेरी विनम्र राय में, इस स्थिति के लिए, मैं देख नहीं क्यों एक साधारण सेवा/प्रत्यक्ष पर्याप्त नहीं है, लेकिन है कि मेरे व्यापार में से कोई भी नहीं है।

अतिरिक्त पठन: Angular 2 - Behavior Subject vs Observable?

+1

धन्यवाद! शायद मेरी समस्या का स्पष्टीकरण इतना अच्छा नहीं था (मैं अंग्रेजी नहीं हूं), इसलिए धैर्य के लिए धन्यवाद। मैंने विषय के साथ प्रयास किया और यह मेरे उद्देश्य (और व्यवहार विषय) के लिए बिल्कुल सही लगता है। – Johannes

+1

@ जोहान्स यह मेरे लिए भी एक दिलचस्प समस्या थी, इसलिए आपका स्वागत है! (और आपकी अंग्रेजी पूरी तरह से ठीक है, मैं एक और भाषाई पृष्ठभूमि से भी हूं;)) – msanford

2

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

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md

+0

धन्यवाद, ऐसा लगता है कि यह काम करता है मेरे उद्देश्य के लिए – Johannes

1

प्रबंध लॉगिन राज्य

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

उदाहरण के लिए:

export class AuthenticationService { 

private loggedIn: boolean = null; 

constructor(private http: Http) { } 

getUserSession(credentials): Observable<boolean> { 

    if (this.loggedIn !== null) { 

    return Observable.of(this.loggedIn); 

    } else { 

    return this.http.get('/authenticate?' + credentials) 
     .map((session: Response) => session.json()) 
     .catch(e => { 
     // If a server-side login gate returns an HTML page... 
     return Observable.of(false); 
     }); 

    } 
} 

और फिर घटक में, बस हमेशा की तरह नमूदार की सदस्यता और मांग पर उस पर कार्रवाई।

वहाँ Angular2 में एक आरएक्स नमूदार की वाक्य रचना के बारे में सवाल का हिस्सा उत्तर देने के लिए

नमूदार सिंटेक्स

Observable.share() और Observable.replay() के साथ इस को प्राप्त करने के अन्य तरीके हैं (चाहिए कि किसी ने Google यह), सामान्य रूप है:

एक सेवा में:

return this.http.get("/people", null) 
    .map(res.json()) 
    .catch(console.error("Error in service") 

और एक घटक में, उदाहरण के लिए:

this.someService.getPeople() 
    .subscribe(
    people => this.people, 
    error => console.warn('Problem getting people: ' + error), 
    () => this.doneHandler(); 
); 

औपचारिक रूप से:

interface Observer<T> { 
    onNext(value: T) : void 
    onError(error: Error) : void 
    onCompleted() : void 
} 

जब "अगला" मूल्य प्राप्त होता है पहले समारोह कहा जाता है। आरईएसटी कॉल (सबसे आम मामले) के मामले में इसमें पूरा परिणाम होता है।

दूसरा फ़ंक्शन एक त्रुटि हैंडलर (मामले में Observable.trow() को सेवा में बुलाया गया था)।

आखिरी बार कहा जाता है जब परिणाम सेट होता है, और कोई पैरामीटर नहीं लेता है। यह वह जगह है जहां आप अपना doSomething() फ़ंक्शन कॉल कर सकते हैं।

+0

धन्यवाद, मैं इस विधि को आजमा रहा हूं। लेकिन आम तौर पर, मैं एक घटक एक्स को "बताना" करने के लिए एक तरीका समझना चाहता हूं कि सेवा में एक परिवर्तनीय मान बदल दिया गया है; इसलिए, एक घटक में, मैं उस चर के लिए सदस्यता लेना चाहता हूं। – Johannes

+0

@ जोहान्स मैं देखता हूं कि आपका क्या मतलब है, इसलिए आप 'Observable.next()' का उपयोग कर देख रहे थे, तो आप इसे लगभग ES6 _ * generator_ की तरह उपयोग कर सकते हैं? या दो-तरफा डेटा बाइंडिंग की भावना रखें, लेकिन सेवा से घटक तक, घटक को देखने के बजाय। कुछ विचार दिमाग में आते हैं जो बहुत ही मूर्खतापूर्ण एनजी 2 नहीं हैं, लेकिन यह एक दिलचस्प सवाल है, इसलिए यदि मैं कुछ ढूंढूं तो मैं इसे स्वयं देख लूंगा और दूसरा जवाब पोस्ट करूंगा। – msanford

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