反序列化对象正在覆盖所有值

时间:2018-12-18 15:00:40

标签: angular typescript deserialization

假设我正在从数据库中获取产品列表,并尝试使用下面的类对数据进行反序列化:

export class Product 
{
    constructor() { this.CartQuantity = 1 }

    Id: number;
    Name: string;
    Price: number;
    CartQuantity: number;
}

数据库仅保存IdNamePrice,而CartQuantity仅存在于项目中。如果我这样反序列化:

products: Product[];

getProducts() {
   this.ProductService.getAllProducts(
     (response) => {
        this.products = response;
     }
  );
}
然后未为每个产品定义

CartQuantity。我知道的唯一解决方案是在获得响应并将其设置为1之后添加for循环。但是,如果我有许多函数可以获取相似的数据,则为每个函数添加循环似乎是一种不好的方法。有没有另一种方法可以做到,就像让构造函数自动设置它一样?

编辑:这是获取数据的服务功能:

getAllProducts(
    onSuccess,
    onFail = (reason) => console.log(reason)) {
      var url = SOME_URL;
      var req = this.httpClient.get(url);
      var promise = req.toPromise();

      promise.then(
        onSuccess,
        onFail
      );
    }

2 个答案:

答案 0 :(得分:1)

使用map运算符来诱变对象并将值分配给CartQuantity

var req = this.httpClient.get(url);
req.pipe(
   map(item => {
      item.CartQuantity = 1
   })
)

答案 1 :(得分:1)

无论是在获得承诺中的响应时还是在将响应分配给产品时,都必须添加一个循环。我添加这个答案是因为我看到您没有实例化Product类来分配给products,这意味着products: Products[]实际上将不包含Product对象,而是一个普通的{id: number, name: string, price: number} Javascript对象(运行时分配)。如果您的Product类包含某种方法,而您尝试使用 说this.products[0].someMethod(),您会收到错误消息。

您应该改为这样做:

getProducts() {
   this.ProductService.getAllProducts(
     (response) => {
        this.products = response.map((eachResponse) => {
            let newProd = new Product();  // anyway you are setting the default value as 1
             // can avoid this loop by directly assigning the props here.
            for (let key in eachResponse) { 
                newProd[key] = eachReponse[key];
            }
            return newProd 
        })
     });
}