gpt4 book ai didi

angular - 访问自定义表单控件的有效值

转载 作者:太空狗 更新时间:2023-10-29 17:17:10 26 4
gpt4 key购买 nike

我创建了表示密码表单控件的自定义组件(以下代码已简化)。

密码组件 (html)

<form [formGroup]="passwordForm">
...
<input formControlName="password" type="password">
</form>

密码组件(ts)

...
@Component({
selector: 'password',
templateUrl: './password.component.html',
styleUrls: ['./password.component.css'],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PasswordComponent),
multi: true
}]
})
export class PasswordComponent implements ControlValueAccessor {

passwordForm: FormGroup;
onChange = (password: string) => { };
onTouched = () => { };

constructor() {
this.passwordForm = new FormGroup({
...
password: new FormControl('')
});

this.passwordForm.valueChanges.subscribe(data => this.onChange(this.value));
}

get value(): string {
return this.passwordForm.get('password').value;
}

writeValue(password: string): void {
this.passwordForm.get('password').setValue(password);
this.onChange(this.value);
}

registerOnChange(fn: any): void { this.onChange = fn; }

registerOnTouched(fn: any): void { this.onTouched = fn; }

setDisabledState?(isDisabled: boolean): void { }
}

我在其他组件中使用它而不是标准输入元素:

<form [formGroup]="userForm">
...
<password formControlName="password"></password>
</form>

验证器来自外部形式(它们未在 PasswordComponent 内部定义)

this.userForm = fb.group({
...
password: ['', [Validators.minLength(10), Validators.maxLength(100)]]
});

我的问题是:我怎样才能得到 <password> PasswordComponent 内部的元素有效性?我想根据有效性对其进行风格化。换句话说,我如何从表示该控件的 PasswordComponent 中获取 userForm 的“密码”控件的有效性。

最佳答案

因为我们无法直接从 DI 系统获取 NgControl 实例,因为我们会遇到循环依赖错误。下图显示了如果我们在自定义值访问器中注入(inject) NgControl 会发生这种情况的原因:

enter image description here

现在应该清楚我们有 NgControl -> FormControlName -> ValueAccessor -> CustomValueAccessor -> NgControl 循环依赖

要解决这个问题,您可以利用Injector 来实现:

component.ts

import { NgControl } from '@angular/forms';
export class PasswordComponent implements ControlValueAccessor {
...
ngControl: NgControl;

constructor(private inj: Injector) {
...
}

ngOnInit() {
this.ngControl = this.inj.get(NgControl)
}

template.html

{{ ngControl.control.valid }}

Plunker Example

关于angular - 访问自定义表单控件的有效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45536108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com