我有一个对象数组,所有对象的“名称”属性都有唯一的值,并且有一个输入字段,用户可以在其中更新对象的“名称”属性。
我想设置一个限制,即更新后的值也应该是唯一的,即不应与其他对象的“名称”属性重复。
所以我实现了一个验证函数,该函数从输入字段获取值并将其与所有对象数组的“ name”属性匹配。
在创建新对象时,它工作正常,但在更新的情况下,即使首次创建DOM也不起作用,因为它的名称已经存在于数组对象中。所以我在验证函数中做了一些更改,在更新值,它获取输入字段的值并将其从对象数组中删除,以使name属性不能与自己的名称重复。
但是问题是对象是与输入字段的双向绑定,因此每次用户输入值时,都会从数组对象中删除相同的值。因此验证逻辑出错。我只需要它的第一时间值,这样我就可以从数组中删除它。但是捕捉值也会随着输入值的改变而改变
nameControl = new FormControl('', [Validators.required]
, this.ValidateNameDuplication.bind(this));
ValidateNameDuplication(control: AbstractControl) {
return this._callServices.getMreAttributes().pipe(map(
e => {
const attrs = e;
const attrIndex = attrs.findIndex(e => e.name == this.newAttr.name);
attrs.splice(attrIndex, 1);
if (attrs.find(e => e.name.toLowerCase() == control.value.toLowerCase())) {
return { validName: true };
}
}
}
));
return null;
}
我的输入字段如下:
<input class="form-control" matInput
placeholder="Name" [formControl]="nameControl" name="N" [(ngModel)]="newAttr.name"
required>