2017-08-22 39 views
5

ऑब्जेक्ट पर देखने के लिए http प्रतिक्रिया को परिवर्तित करें मैं अवलोकन की अवधारणाओं के लिए नया हूं और रूपांतरण के साथ कुछ मदद की आवश्यकता है।
मेरे पास एक सेवा है जो एक एचटीपी अनुरोध से Observable<Response> लौटाती है, लेकिन मुझे कनेक्ट विधि के अंदर DataSource पर इसका उपयोग करने के लिए Observable<PriceTag> को परिवर्तित करने की आवश्यकता है।
क्या ऐसा करने के लिए वैसे भी है? यहाँकोणीय 4, ऑब्जेक्टिव

getPriceTags(): Observable<Response> { 

    // Set the request headers 
    const headers = new Headers({ 'Content-Type': 'application/json' }); 

    // Returns the request observable 
    return this.http.post(Constants.WEBSERVICE_ADDRESS + "/priceTag", null, {headers: headers}); 

} 

और डेटा स्रोत वर्ग है, जहां मैं एक Observable<PriceTag> के रूप में यह वापस जाने के लिए की जरूरत है:

यह मेरी सेवा से विधि है

export class PriceTagDataSource extends DataSource<PriceTag> { 

    constructor (private priceTagService: PriceTagService) { 
     super(); 
    } 

    connect(): Observable<PriceTag> { 

     // Here I retrieve the Observable<Response> from my service 
     const respObs = this.priceTagService.getPriceTags(); 

     // Now I need to return a Observable<PriceTag> 

    } 

    disconnect() {} 

} 

यहाँ से प्रतिक्रिया से एक उदाहरण है मेरी अनुरोध:

{ 
    // This object is used to check if the query on the server was sucessful 
    "query": { 
     "sucessful": true 
    }, 

    // These are my PriceTags 
    "tags": [ 
     { 
      "id": "1", 
      "name": "MAIN" 
     }, 
     { 
      "id": "2", 
      "name": "CARD" 
     } 
    ] 
} 
+0

जवाब से सहायता था का उपयोग करें? –

उत्तर

13

:

export class PriceTag extends Serializable {} 

फिर, अपने GetPriceTags समारोह की जरूरत के लिए परिवर्तित किया जाना कोणीय 4.3 के रूप में यह स्वचालित रूप से किया जा सकता है।

उदाहरण:

export class SomeService { 
    constructor(private http: HttpClient) {} // <--- NOTE: HttpClient instead of Http 

    getSome(): Observable<MyAwesomeObject> { 
     return this.http.get<MyAwesomeObject>.get('myUrl'); 
    } 
} 
अपने मामले में

ताकि होगा:

return this.http.post<PriceTag>(Constants.WEBSERVICE_ADDRESS + "/priceTag", null, {headers: headers});

फिर, HttpClient के बजाय Http

+1

Ooooh मैं यह है कि ... साफ – diopside

+0

वहाँ कि और 'getSome() के बीच एक अंतर है कर सकता है पता नहीं था: प्रत्यक्ष { इस वापसी। http.get ('myUrl')। नक्शा ((प्रतिक्रिया) => response.json()); } ' –

+0

@RobinDijkhof ऐसा लगता है जैसे प्रितेश पूछ रहा है अगर कोई अंतर है, क्योंकि वह अपनी सजा शुरू करता है" क्या कोई अंतर है ..."और नहीं" एक अंतर है ... " –

-3

बस Observable<Response> सेमें बदलें

ये प्रकार कास्टिंग टाइपस्क्रिप्ट के लिए हैं ताकि यह सुनिश्चित किया जा सके कि आप सही प्रकार भेज रहे हैं/उम्मीद कर रहे हैं।

संपादित

import { PriceTag } from 'your-path-to-model'; 

getPriceTags(): Observable<Response> { 
    // Set the request headers 
    const headers = new Headers({ 'Content-Type': 'application/json' }); 

    // Returns the request observable 
    return this.http.post(Constants.WEBSERVICE_ADDRESS + "/priceTag", null, {headers: headers}) 
    .map((res: Response) => { 
     return new PriceTag(res.json()); 
    }); 
} 
+3

यह इतना गलत है, क्योंकि वर्तमान कार्यान्वयन एक मूल्यटाग वापस नहीं करता है। – Boland

2

मुझे लगता है कि अपने HTTP प्रतिक्रिया एक pricetag युक्त एक JSON है? मुद्दा यह है कि आप एक PriceTag ऑब्जेक्ट बनाना चाहते हैं। आप जेएसन को टाइप कास्टिंग द्वारा एक प्राइसटाग में कनवर्ट कर सकते हैं, लेकिन फिर यह वास्तविक प्राइसटैग ऑब्जेक्ट नहीं होगा।

जिस तरह से हम इस का समाधान कर लिया है:

export class Serializable { 
    constructor(json?: any) { 
    if (json) { 
     Object.assign(this, json); 
    } 
    } 
} 

और फिर एक serializable वर्ग:

getPriceTags(): Observable<PriceTag> { 

    // Set the request headers 
    const headers = new Headers({ 'Content-Type': 'application/json' }); 

    // Returns the request observable 
    return this.http.post(Constants.WEBSERVICE_ADDRESS + "/priceTag", null, {headers: headers}) 
    .map(res => new PriceTag(res.json())); 

} 
+0

प्यार अपने "वह यह है कि इतना गलत टिप्पणी" btw – Sonicd300