- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建了表示密码表单控件的自定义组件(以下代码已简化)。
密码组件 (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
会发生这种情况的原因:
现在应该清楚我们有 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 }}
关于angular - 访问自定义表单控件的有效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45536108/
我可以为属性 contenteditable 选择什么值。 最佳答案 它可以包含: true 错误 继承 引用: The contentEditable DOM attribute, on getti
我在签署 Ionic android apk 时遇到此错误,我在 Kubuntu 17.04 上,使用 Ionic 3,安装了 java 8 我得到的错误: Enter Passphrase for
我是一名优秀的程序员,十分优秀!