2016-02-23 4 views
11

के उदाहरण के लिए कोणीय 2 मानचित्र http प्रतिक्रिया मैं सोच रहा हूं कि मूल जावास्क्रिप्ट ऑब्जेक्ट के बजाय कक्षा में अनुरोध प्राप्त करने से http प्रतिक्रिया को मैप करने का सबसे अच्छा तरीका क्या है।कक्षा

मेरे वर्तमान प्रयास में मैं सरल new ClassName(data) करता हूं, लेकिन ऐसा करने के लिए एक अस्पष्ट कोणीय निर्दिष्ट और पूरी तरह से शानदार तरीका हो सकता है जो मुझे नहीं पता।

getPost(id:number){ 
    return this._http.get(this._postsUrl+'/'+id) 
       .map(res => new Post(res.json().data)) 
       .do(data => console.log(data)) 
       .catch(this.handleError); 
} 

मैं क्योंकि मैं तरीकों के अंदर है पोस्ट वर्ग और न सिर्फ एक इंटरफेस होने की जरूरत:

यहाँ मेरे वर्तमान कोड है।

getHeroes() { 
return this.http.get(this._heroesUrl) 
       .map(res => <Hero[]> res.json().data) 
       .catch(this.handleError); 
} 

मैं किसी भी तरह <Hero[]> हिस्सा उम्मीद सिर्फ इतना है कि ऐसा करने के लिए:

मैं HeroTutorial और http "डेवलपर मार्गदर्शिका" के साथ और उनके getHeroes विधि वे करते में पीछा हीरो क्लास ले लो और नया उदाहरण बना इसके बारे में, लेकिन मेरे परीक्षणों से पता चलता है कि यह नहीं है, यह टाइपस्क्रिप्ट के लिए बहुत कुछ है जो यह जानना है कि क्या उम्मीद करनी है।

कोई विचार? धन्यवाद!

+4

यह कोणीय या एचटीपी से संबंधित नहीं है, लेकिन केवल टाइपस्क्रिप्ट => जेएसओएन को एक ठोस वर्ग उदाहरण में कैसे deserialize करने के लिए। –

+2

'नया क्लासनाम (डेटा) 'पूरी तरह से मान्य है, आप चेन ऑपरेटर कर सकते हैं और मैपिंग, फ़िल्टरिंग, कम कर सकते हैं ... पर्यवेक्षकों को उनकी परवाह नहीं है (; – Sasxa

+0

@ गुंटर ज़ोचबाउर ऐसा लगता है कि आप सही हैं, उन लोगों की त्वरित खोज शब्दों ने बहुत सारे परिणाम वापस कर दिए हैं। उनमें से कोई भी वास्तव में मैं जो सुनना चाहता था, लेकिन मैं कुछ जानना चाहता हूं कि ऐसा करने का कोई अच्छा तरीका नहीं है। – Growiel

उत्तर

15

मुझे लगता है कि आप जावास्क्रिप्ट वस्तुओं की map विधि का उपयोग कर सकता है कि:

getHeroes() { 
    return this.http.get(this._heroesUrl) 
      .map(res => { 
       return res.json().data.map((elt) => { 
       // Use elt to create an instance of Hero 
       return new Hero(...); 
       }); 
      }) 
      .catch(this.handleError); 
} 
+1

ग्रेट, यह एक आकर्षण की तरह काम करता है! चिह्नित किया जाना चाहिए समाधान के रूप में। धन्यवाद, थियरी! – Juergen

2

वस्तु पर प्रोटोटाइप की स्थापना करके लौटाए जाने मैं अपने वर्ग का एक उदाहरण प्राप्त करने में सक्षम था।

getHero() { 
     return this.http.get(this._heroUrl) 
      .map(response => { 
        let res = <Hero> response.json(); 
        Object.setPrototypeOf(res, Hero.prototype); 
        return res; 
        }) 
      .catch(this.handleError); 
} 

मेरी कक्षा एक parameterless निर्माता तो यह मेरे लिए काम किया साथ बहुत आसान था। अधिक जटिल कक्षाओं के लिए मुझे नहीं पता कि यह काम करेगा या नहीं।

नोट: उपर्युक्त कोड प्राप्त करने के लिए हैरो() नहीं मिलता हैरो()। मुझे लगता है कि मैं सरणी में प्रत्येक आइटम पर प्रोटोटाइप सेट करके सूची के साथ एक ही चीज़ कर सकता हूं लेकिन मैंने कोशिश नहीं की है/इसकी पुष्टि नहीं की है।

संदर्भ: मैं BMiner द्वारा this post से इस के लिए विचार आया

1

अच्छा अभ्यास

Observable<Model> 

(कोणीय प्रलेखन के लिए के बारे में https://angular.io/guide/http) तो का उपयोग कर प्राप्त प्रतिक्रिया से डेटा का उपभोग करने के लिए है ...

// आयात

import {HttpClient} from "@angular/common/http"; 

// निर्माता पैरामीटर सूची में

private http: HttpClient 

// सेवा विधि

getHeroes(): Observable<Hero[]> {return this.http.get<Hero[]>({url}, {options});} 

आप कुछ और करने की जरूरत नहीं है। मैं इस दृष्टिकोण को सबसे दोस्ताना मानता हूं।