有一个模型:
export class People {
address: string;
document: {
number: string;
serial: string;
lastName: string;
};
...
ctor
...
get serialNumber() {
return this.document.serial || '' + ' ' + this.document.number;
}
set serialNumber(value) {
console.log('значения', value);
const [serial, number] = value.split('');
this.document.serial = serial;
this.document.number = number;
}
}
有一个表单组件(PeopleForm):
this.people = new People();
this.peopleForm = new FormGroup({
address: new FormControl(this.people.address, []),
document: new FormGroup({
lastName: new FormControl(this.people.document.lastName, []),
serialNumber: new FormControl(this.people.serialNumber, []),
license: new FormControl(this.people.document.license, [])
})
});
从模型中可以看出,我在文档中有两个属性: serial,number。我希望这两个属性以单一名称serialNumber的形式出现(抛出某种掩码)。我在模型中创建了一个 get/set,但是,唉,由于某种原因它不起作用。
告诉我如何解决问题任务?
如果我理解正确,您想将表单绑定到您的
People. 好吧,看,第一个选项是简单地监听表单值的变化并将该值设置为一个对象people:在这里,我们不
value直接将对象的值设置为people(this.people = value),因为生成的流值valueChanges是对象字面量,我们不想失去类的功能People。这种方法的问题是表单生成的对象的模型键与您的
People.更好的选择是显式使用表单并分别订阅每个控件(这样您将 100% 确定所需的属性已设置),在类中
People您可以创建多个方法来分别使用每个控件,控件本身将采用参数和生成器:并像这样调用这些方法:
是否存在代码重复?当然。听起来像反模式?并非如此,因为您正在显式管理数据流,同时还消除了各种内存泄漏。
当然,如果你的对象是一个简单的对象字面量,解决这样的问题会容易 100 倍
people,但是你正在使用一个People有自己的业务逻辑、setter、getter 等的类实例。当然,您可以尝试作弊以避免重复:
那么控制设置代码就变成了: