एक वादा में नमूदार Http के प्राप्त द्वारा दिया() विधि कन्वर्ट करने के लिए कोई जरूरत नहीं है मदद करता है। ज्यादातर मामलों में, सेवा केवल देखने योग्य वापस कर सकते हैं।
हम एक सरणी या सर्वर से एक आदिम प्रकार (यानी, स्ट्रिंग, संख्या, बुलियन) फ़ेच कर रहे हैं, तो हम अपने टेम्पलेट में सीधे लौटे नमूदार का उपयोग कर, asyncPipe साथ द्वारा हमारे नियंत्रक तर्क सरल बना सकते हैं । यह पाइप स्वचालित रूप से अवलोकन करने योग्य (यह एक वादे के साथ भी काम करता है) की सदस्यता लेगा और यह सबसे हालिया मूल्य वापस कर देगा जो अवलोकन योग्य है। जब कोई नया मान उत्सर्जित होता है, तो पाइप घटक को परिवर्तनों के लिए चेक करने के लिए चिह्नित करता है, इसलिए दृश्य स्वचालित रूप से नए मान के साथ अपडेट हो जाएगा।
हम सर्वर से एक वस्तु फ़ेच कर रहे हैं, तो
मैं इस प्रकार किसी भी तरह से asyncPipe,
उपयोग करने के लिए हम सुरक्षित नेविगेशन ऑपरेटर के साथ async पाइप इस्तेमाल कर सकते हैं संयोजन के रूप में, के बारे में पता नहीं कर रहा हूँ:
{{(objectData$ | async)?.name}}
लेकिन यह जटिल लग रहा है, और हमें उस ऑब्जेक्ट प्रॉपर्टी के लिए दोहराना होगा जिसे हम प्रदर्शित करना चाहते हैं।
इसके बजाय, मैं घटक में देखने योग्य में subscribe()
का सुझाव देता हूं और निहित वस्तु को घटक गुण में संग्रहीत करता हूं। हम तब safe navigation operator (?।) या (जैसा कि टिप्पणी में उल्लिखित @Evan Plaice के रूप में) टेम्पलेट में NgIf का उपयोग करें। अगर हम सुरक्षित नेविगेशन ऑपरेटर या NgIf का उपयोग नहीं करते हैं, तो टेम्पलेट पहले प्रस्तुत करने का प्रयास करते समय एक त्रुटि फेंक दी जाएगी, क्योंकि ऑब्जेक्ट अभी तक किसी मान के साथ पॉप्युलेट नहीं किया गया है।
ध्यान दें कि नीचे दी गई सेवा हमेशा प्राप्त विधियों के लिए एक अवलोकन योग्य कैसे होती है।
service.ts
import {Injectable} from 'angular2/core';
import {Http} from 'angular2/http';
import 'rxjs/add/operator/map'; // we need to import this now
@Injectable()
export class MyService {
constructor(private _http:Http) {}
getArrayDataObservable() {
return this._http.get('./data/array.json')
.map(data => data.json());
}
getPrimitiveDataObservable() {
return this._http.get('./data/primitive.txt')
.map(data => data.text()); // note .text() here
}
getObjectDataObservable() {
return this._http.get('./data/object.json')
.map(data => data.json());
}
}
app.ts
import {Component} from 'angular2/core';
import {MyService} from './my-service.service';
import {HTTP_PROVIDERS} from 'angular2/http';
@Component({
selector: 'my-app',
providers: [HTTP_PROVIDERS, MyService],
template: `
<div>array data using '| async':
<div *ngFor="#item of arrayData$ | async">{{item}}</div>
</div>
<div>primitive data using '| async': {{primitiveData$ | async}}</div>
<div>object data using ?.: {{objectData?.name}}</div>
<div *ngIf="objectData">object data using NgIf: {{objectData.name}}</div>`
})
export class AppComponent {
constructor(private _myService:MyService) { console.clear(); }
ngOnInit() {
this.arrayData$ = this._myService.getArrayDataObservable();
this.primitiveData$ = this._myService.getPrimitiveDataObservable();
this._myService.getObjectDataObservable()
.subscribe(data => this.objectData = data);
}
}
नोट: मैं सेवा विधि के नाम में "प्रत्यक्ष" डाल – जैसे, getArrayDataObervable()
– सिर्फ उजागर करने के लिए इस विधि का एक प्रत्यक्ष रिटर्न । आम तौर पर आप नाम में "अवलोकन" नहीं डालेंगे।
डेटा/array.json
[ 1,2,3 ]
डेटा/आदिम।json
Greetings SO friends!
डेटा/object.json
{ "name": "Mark" }
आउटपुट:
array data using '| async':
1
2
3
primitive data using '| async': Greetings SO friends!
object data using .?: Mark
object data using NgIf: Mark
Plunker
एक usin साथ खामी जी async
पाइप यह है कि घटक में सर्वर त्रुटियों को संभालने के लिए कोई तंत्र नहीं है। मैं answered another question बताता हूं कि घटक में ऐसी त्रुटियों को कैसे पकड़ें, लेकिन हमें इस मामले में हमेशा subscribe()
का उपयोग करने की आवश्यकता है।
आप ** '.toromrom()' को जोड़कर एक वचन के रूप में HTTP का उपयोग कर सकते हैं, इसके बाद '.then()' कॉल की आपकी श्रृंखला के बाद। फिर भी, अवलोकन योग्य अनुशंसित दृष्टिकोण हैं। –
@EvanPlaice हाँ मैंने उनके बारे में पढ़ा है और अब मैं पर्यवेक्षकों का प्रशंसक हूं :) –
इस पर एक नज़र डालें http://stackoverflow.com/a/34758630/5043867 –