मैं एक बूलियन अवलोकन योग्य के आधार पर एक अवलोकन योग्य श्रृंखला/पाइप निष्पादित करने का प्रयास कर रहा हूं जिसका उपयोग किसी टेम्पलेट में किसी स्थिति में किया जाता है।
लेकिन पाइप() कथन में कोड कभी भी निष्पादित नहीं होता है, भले ही मैं टेम्पलेट में देखने योग्य बूलियन पर एसिंक पाइप का उपयोग कर रहा हूं।
<div>{{isAllowed$ | async}} --- resolves to true or false and shows on html page
<div *ngIf="isAllowed$ | async>
//other items
</div>
ngOnInit() {
this.isAllowed$ = callToMethodThatReturnsBooleanObservalble();
this.isAllowed$.pipe(
tap(val => { // -- never gets executed
if(val) {
//make rest call --- never gets executed
}
})
)
}
अगर मैं पाइप के अंत में सब्सक्राइब() डालता हूं तो यह काम करता है लेकिन मुझे लगा कि एसिंक पाइप ने हमारे लिए ऐसा किया है।
2 जवाब
आपके द्वारा की जाने वाली कॉल में आपको पाइप जोड़ने की आवश्यकता है:
ngOnInit() {
this.isAllowed$ = callToMethodThatReturnsBooleanObservalble().pipe(
tap(val => {
if(val) {
}
})
);
}
pipe
विधि एक नया Observable
बनाता है, इसलिए जब आप इसे पहले की तरह करते हैं, तो वह अवलोकन योग्य संग्रहीत नहीं होता है, और टेम्पलेट में सदस्यता भी नहीं लेता है
आप Rxjs विषय का उपयोग कर सकते हैं। यह एक अवलोकन योग्य के रूप में भी कार्य करता है और जब भी आप डेटा के परिवर्तन पर अपडेट करना चाहते हैं तो 'अगला' का उपयोग करके डेटा उत्सर्जित कर सकते हैं। मैन्युअल रूप से सदस्यता लेने की कोई आवश्यकता नहीं है क्योंकि आप "async" पाइप का उपयोग कर रहे हैं।
आप अपने कोड में ऐसा कुछ उपयोग कर सकते हैं।
<div>
<div *ngIf="(isAllowed$ | async)">
//other items
</div>
</div>;
// In your .ts file //
public isAllowed$ = new Subject<boolean>();
ngOnInit() {
// Pass your function that returns a boolean in your subject isAllowed.
// and your subscription will trigger whenever there is a change
this.isAllowed$.next(callToMethodThatReturnsBooleanObservalble());
}