2017-10-19 32 views
0

我有一個表示從API返回的數據結構的類。我添加了一些便利方法,它們將邏輯應用於這些字段以返回計算值。將HttpResponse強制轉換爲指定類型的項目,並使用自定義方法完成

當我使用HttpClient請求數據,然後嘗試與這些便捷方法進行交互時,它不起作用。我得到一個錯誤:

TypeError: item.<method> is not a function. (In 'item.<method>()', 'item.<method>' is undefined) 

這是因爲如果該對象未實例化類項目的實例,它只是驗證,你從來沒有把它當作什麼,但一個項目。所以,在類定義中定義的所有函數都不會附加到對象上。

有沒有辦法不只是類型檢查,而是強制JSON成爲Item類型的實際對象?

我想我可以添加一個構造函數,它接受通用對象並將所有字段複製到新對象的字段中。但是,這不僅看起來效率很低,而且還有代碼味道。

是否有一種乾淨的方式來獲取從HttpClient/HttpResponse返回的對象,以包含這些便利功能?

我嘗試使用Object.assign()作爲@DeborahK建議:

return this.http.get<Item[]>(`${this.apiUrl}/view/projects`, this.options) 
    .map((response: HttpResponse<Item[]>) => { 
    var result = Object.assign(new Array<Item>(),response.body); 
    console.log(result); 
    return result; 
    }); 

什麼被寫入到控制檯是一個數組,它包含所有的數據,但沒有一個元素都是項目。可能是因爲我沒有創建一個項目數組,我創建了一個應該包含項目的數組。

所以我修改了它,像這樣:

return this.http.get<Item[]>(`${this.apiUrl}/view/projects`, this.options) 
    .map((response: HttpResponse<Item[]>) => { 
    var result = response.body.map((item:Item) => 
     Object.assign(new Item(),item)); 
    console.log(result); 
    return result; 
    }); 

以及創建項目的數組。好極了!問題解決了!謝謝@DeborahK

回答

1

HttpClient提供了與提供的類或接口相匹配的佈局中的數據,但正如您所見,它實際上並不創建類本身的一個實例。

在你.subscribe,你可以做這樣的事情:

Object.assign(new Item(), data); 

哪裏Item是你的類和data的名字是從HTTP請求回來的數據。

這將創建類的新實例並將返回的數據分配給該實例。

如果你想提供更多的代碼,我可以提供一個更具體的例子。

+0

不幸的是,這似乎並沒有奏效。爲了增加清晰度,我將用我試過的代碼更新這個問題。 –

+0

得到它的工作!感謝您的幫助 –

相關問題