我有一个api,它返回给我一个json,我把响应转发给我的班级,这个工作正常。但是json并没有在类中包含一些varibales,我希望这些变量在没有设置的情况下用null初始化。但他们根本没有出现(他们消失了),我得到一个例外,他们不在那里他们应该在那里。请解释为什么会发生这种情况会非常令人满意。
export class CustomPurchaseOrderProduct {
constructor(
public productId: number,
public productName: string,
public warehouseName: string,
public binLocationCode: string,
public amountInStock: number,
public sellingPrice: number,
public productTaxRate: number,
public calculatedTax: number,
public unitPrice: number,
public discount: number
) {}
}
getCustomProductOrders() {
const url = `${this.localUrl}purchaseOrderProducts`;
return this.http.get(url)
.map(response => <CustomPurchaseOrderProduct[]>response.json());
}
getAllPurchaseOrderProducts() {
this.purchaseOrderService.getCustomProductOrders()
.subscribe(
response => this.customPurchaseOrderProducts = response
);
}
console.log('This is form Object', this.customPurchaseOrderProducts[index].calculatedTax);
数组中的JSON对象
{
"productId": 8,
"productName": "Akomka ",
"warehouseName": null,
"binLocationCode": null,
"amountInStock": 0,
"sellingPrice": 0,
"productTaxRate": 10,
"unitPrice": 0
}
所以我希望我的CalculatedTax,UnitPrice和Discount为null但是当我控制台登录对象时它们不在那里
当我控制台登录时,calculatedTax和其他变量不在对象中。
答案 0 :(得分:0)
通过这样做:
.map(response => <CustomPurchaseOrderProduct[]>response.json());
您只是告诉编译器您知道数据的形状,并确信它与您的类匹配。如果您在控制台上记录响应,您可以看到它是一个简单的POJO并将控制日志Object {...}
,因此它实际上不是您班级的实例。
如果你真的希望它是你的类的一个实例并且具有可能不存在的属性,那么你可以像注释中提到的那样将它们作为可选属性。如果该属性不存在,则分配null值。所以你的缩短课程:
export class CustomPurchaseOrderProduct {
private productId: number;
private productName: string;
private calculatedTax?: number;
constructor(
productId: number,
productName: string,
calculatedTax?: number
) {
this.productId = productId;
this.productName = productName;
this.calculatedTax = calculatedTax || null
}
}
因此,我们将calculatedTax
标记为可选,如果它不在响应中,我们会将null
分配给该属性。请注意,您需要在构造函数中将可选属性标记为last。
然后在http请求中,您需要将传入数据创建为类的实例,因此您需要执行以下操作:
getCustomProductOrders() {
const url = `${this.localUrl}purchaseOrderProducts`;
return this.http.get(url)
.map(response => <CustomPurchaseOrderProduct[]>response.json()
.map(data =>
new CustomPurchaseOrderProduct(data.productId, data.productName, data.calculatedTax)
)
)
}
使用类与接口是一个值得商榷的问题,有些更喜欢接口,有些类更喜欢。所以你也可以使用接口,但仅此一点并不能解决问题。当您获得响应,迭代数据并检查对象中是否存在属性时,也可以解决此问题,如果没有,则使用null
进行分配。但上面的解决方案是使用类:)