假设我正在从数据库中获取产品列表,并尝试使用下面的类对数据进行反序列化:
export class Product
{
constructor() { this.CartQuantity = 1 }
Id: number;
Name: string;
Price: number;
CartQuantity: number;
}
数据库仅保存Id
,Name
和Price
,而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
);
}
答案 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
})
});
}