我正在使用反应式表单,并且在理解数据如何映射到表单的控件时遇到了一些麻烦。让我们举一个具有 id 和名称的对象控件的示例。此控件应呈现为输入文本框,并且用户键入 Id。然后,我使用自动完成功能远程查找对象并使用如下所示的数据填充底层对象
{ id: 1234, description: "Some description" }
因为,这是一个对象而不是字符串 - 输入框显示 [object Object] 作为其值。我假设我需要toString
为此对象提供一种方法才能显示这样的值1234 - Some description
。
这是表单配置:
this.orderForm = this.fb.group({
customer: '',
....
items: this.fb.array([ this.initItems() ])
...
这些对象之一也是如此customer
,并且该对象上还有另一个类似的item
对象。
export class Customer {
id: string;
descr: string;
toString = () => this.id + " - " + this.descr
}
export class ItemDetail {
id: string;
descr: string;
toString = () => this.id + " - " + this.descr
}
export class Order {
id: string;
...
customer: Customer;
items: Item[]
}
export class Item {
...
detail: ItemDetail
...
}
获得订单数据后,我会以如下形式加载它:
const itemsFGs = order.items.map(item => this.fb.group(item));
const itemsFA = this.fb.array(itemsFGs);
this.orderForm.setControl('items', itemsFA);
问题是数据作为普通对象加载,并且没有类型转换为适当的类,因此,toString
任何嵌套对象都没有方法可以显示输入框[object Object]
而不是使用 toString 方法。
示例订单的 json 如下所示:
{
id: "1",
customer: {
id: "1",
name: "some customer"
},
items: [{
detail: {
id: "1",
descr: "some item"
}
}]
}
主要问题是,如何确保以 json 形式传入的数据被捕获在适当的类中,以便 toString 等方法可用于正确显示。