离子4角度data.map不是函数

时间:2020-02-14 20:14:41

标签: angular typescript model ionic4

我正在尝试将来自http请求的响应存储到模型中。我遵循this指南,并设法将数据传递到模型中。但是我认为我做错了,因为我无法使它显示在html上,并且从控制台看到的输出有些混乱。

我相信我的错误在于访问json响应,但我似乎找不到该错误。谁能帮我指出我的错误?

我的模特。

// data.model.ts
import { Fruits } from './fruitsId.model';
import { Deserializable } from './deserialize.model';

export class Data implements Deserializable {
  data: Fruits[];

  deserialize(input: any): this {
    Object.assign(this, input);
    this.data = input.data.map(data => new Fresh().deserialize(data));

    return this;
  }
}
// fruits.model.ts
import { Deserializable } from './deserialize.model';
import { FruitsId } from './fruitsId.model';
import { CustomerId } from './customerId.model';
import { StoreId } from './storeId.model';

export class Fresh implements Deserializable {
    public fruitsId: FruitsId;
    public time: string;
    public customerId: CustomerId;
    public storeId: StoreId;
    public name: string;
    public text: string;

    deserialize(input: any): this {
    Object.assign(this, input);
    this.fruitsId = new FreshId().deserialize(input.freshId);
    this.customerId = new HumanId().deserialize(input.humanId);
    this.storeId = new MasterId().deserialize(input.masterId);

    return this;
    }
}
// fruitsId.model.ts
import { Deserializable } from './deserialize.model';

export class FruitsId implements Deserializable {
    type: string;
    id: string;

    deserialize(input: any): this {
       return Object.assign(this, input);
    }
}

后跟具有与freshId.model.ts相同格式的customerId.model.ts和storeId.model.ts。

我的服务。

// fruits.service.ts
public getAllThings(): Observable<any> {
// Some httpOptions here
// ...
return this.http
  .get(`${this.url}`, httpOptions)
  .pipe(
    // ERROR HERE: data.map is not a function
    map(data => data.map(data => new Data().deserialize(data))),
  );
}

来自HTTP GET的示例响应。

{
  "data": [
    {
      "id": {
        "type": "red",
        "id": "123"
      },
      "time": 1579677349193,
      "customerId": {
        "type": "retailer",
        "id: "234"
      },
      "storeId": {
        "type": "abc Store",
        "id": "001"
      },
      "name": "Apple",
      "text": "very delicious"
    }
  ]
}

最后在home.page.ts

// Some imports
// ...

export class DashboardPage implements OnInit {

  fruitsList: any = [];
  data: Data[];

  constructor(private fruitsService: FruitsService) { }

  ionViewWillEnter() {
    this.getFruits();
  }

  getFruits() {
    this.fruitsService.getFreshes().subscribe(
      res => this.data = res
    );
  }

}

1 个答案:

答案 0 :(得分:0)

指南的作者。

您的响应不是是一个数组,但是在响应上调用.map完全是这样。查看您的回复,正确的反序列化将会是

map(response => response.data.map(...))

因为data仅是将实际数据保存在data属性中的整个响应。

您始终可以通过将lambda函数替换为以下内容来查看响应的形状:

map(response => {
  console.log(response);
  return response.data.map(...);
})