आप इस तरह से इस तरह से जा रहे हैं कि ढांचे के खिलाफ काम कर रहा है, और दांतों के बहुत चिल्लाने और पीसने के लिए जा रहा है।
अभी, आप मैन्युअल रूप से एक नमूदार सब्सक्राइब कर रहे - httpFileService.progress$
- और फिर मैन्युअल रूप से एक बच्चे ProgressBar
घटक पर एक संपत्ति को अद्यतन करने, के कोणीय परिवर्तन का पता लगाने के तंत्र को दरकिनार - जिसके कारण यूआई अपडेट नहीं हो रहा है। आप मैन्युअल इस संपत्ति सेट करने के बाद परिवर्तन का पता लगाने आग सकता है और यूआई के रूप में उम्मीद अद्यतन होगा - लेकिन फिर, आप ढांचे के खिलाफ काम करना चाहते हैं, तो चलो कैसे इसके साथ बजाय काम करने के लिए पर ध्यान दें:
मुझे लगता है कि यह मान "अन्यत्र" आपके ProgressBar
घटक का अभिभावक है - चलो ElsewhereComponent
पर कॉल करें।
@Component({
selector: 'elsewhere',
directives: [ProgressBar],
template: `
<div>
<progress-bar [currentProgress]="httpFileService.progress$"></progress-bar>
</div>
`
})
class ElsewhereComponent {
// you can remove the ngOnInit and onProgress functions you posted
// you also don't need a reference to the child ProgressBar component
// ... whatever else you have in this class ...
}
यहाँ नोट करने के लिए सबसे महत्वपूर्ण बात यह progress-bar
घटक पर [currentProgress]
के अलावा है: यह कह रही एक इनपुट संपत्ति currentProgress
कि घटक है कि httpFileService.progress$
करने के लिए बाध्य किया जाना चाहिए पर नामित है कोणीय है।
लेकिन अब आप कोणीय से झूठ बोल चुके हैं - जैसा कि यह खड़ा है, ProgressBar
में कोई इनपुट नहीं है, और कोणीय आपको इसके बारे में बताएगा जब यह इस अनगिनत संपत्ति को दिए गए मान को बांधने का प्रयास करता है। इसलिए हम इनपुट संपत्ति जोड़ने की जरूरत है, और कहा कि ऐसा करने का पसंदीदा तरीका Input()
डेकोरेटर के साथ है:
@Component({
selector : 'progress-bar',
pipes: [AsyncPipe] //import this from angular2/core
template : `
<div class="progress-container">
<div>{{currentProgress | async}}</div>
<div [style.width.%]="currentProgress | async" class="progress"></div>
</div>
`
})
export class ProgressBar {
@Input() currentProgress: Observable<number>;
...
constructor(){
// remove the line you have in here now
}
}
यहां दो महत्वपूर्ण मतभेद दिये गये हैं: सबसे पहले, @Input()
कोणीय बताता है कि currentProgress
एक इनपुट संपत्ति है। हम यह भी Observable<number>
को number
से है कि संपत्ति के प्रकार को बदल दिया - इस सख्ती से आवश्यक नहीं है, लेकिन यह उपयोगी है क्योंकि यह दूसरा महत्वपूर्ण अंतर की अनुमति देता है:
AsyncPipe
घटक के pipes
में जोड़ दिया गया है, और दोनों में इस्तेमाल किया इसके टेम्पलेट बाइंडिंग के currentProgress
पर। यह उपयोगी है क्योंकि यह अवलोकन को सब्सक्राइब करने और प्रत्येक बार जब यह एक नया मान निकलता है तो यूआई को अपडेट करने के सभी गंदे काम को संभालने के लिए कोणीय को बताता है।
और वह यह सब ले जाता है: दोनों बार की चौड़ाई और पाठ के ऊपर यह अब मान अपने httpFileService
से उत्सर्जित प्रतिबिंबित करने के लिए आप अपडेट हो जाएगा, और आप के लिए जरूरी कोड की एक पंक्ति लिखने के लिए नहीं था इसे करना ही होगा।
यदि आप मुझे यह दिखाने के लिए अपना प्रश्न अपडेट करेंगे कि कैसे 'ऑन प्रोग्रेस' कहा जा रहा है, तो मैं शायद आपके उत्तर को आपके लिए अधिक उपयोगी बना सकता हूं - मुझे संदेह है कि यहां उपयोग में एक गहन विरोधी पैटर्न है। – drewmoore
ऑन प्रोग्रेस भाग जोड़ा गया। यह एक एक्सएचआर प्रगति के माध्यम से पुनर्प्राप्त किया गया है जिसका मैं सदस्यता लेता हूं। – Dreamlines
मैं सही था :-) बस एक सेकंड और मैं – drewmoore