gpt4 book ai didi

angular - Angular Material 中具有错误验证的ControlValueAccessor

转载 作者:行者123 更新时间:2023-12-03 16:08:27 27 4
gpt4 key购买 nike

我试图在自定义 Material 输入文本框中使用ControlValueAccessor应用错误验证样式。自从应用此自定义组件以来,所有带有formControlName/FormBuilders的红色边框验证状态都不会显示(对于必填项,最小长度等)。它与Angular Material文本框一起(开箱即用)工作,直到应用了自定义控件为止。

目标是使自定义文本框与表单验证一起使用。使用matInput文本框自然显示了这一点。

更新:
发表答案;但是不确定是否最有效的方法(试图使Saloo答案也起作用)(如果有人可以发布stackbliz,那将是不错的选择),是否接受任何更有效的方法

enter image description here

typescript :

import { Component, OnInit, Input, ViewChild, EventEmitter, Output, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
selector: 'app-input-textbox',
templateUrl: './input-textbox.component.html',
styleUrls: ['./input-textbox.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => InputTextboxComponent),
multi: true
}
]
})

export class InputTextboxComponent implements OnInit, ControlValueAccessor {
@Input() MaxLength: string;
@Input() Value: string;
@Input() type: string;
@Input() Label: string;
@Input() PlaceHolder: string;
@Output() saveValue = new EventEmitter();
@Output() onStateChange = new EventEmitter();

disabled: boolean;

constructor() { }

ngOnInit() {
}

saveValueAction(e) {
this.saveValue.emit(e.target.value);
}

onChange(e) {
this.Value = e;
}

onTouched() {
this.onStateChange.emit();
}

writeValue(value: any) {
this.Value = value ? value : '';
}

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

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

setDisabledState(isDisabled) { this.disabled = isDisabled; }
}

HTML:
<div class="input-wrap">
<mat-form-field appearance="outline">
<mat-label>{{Label}}</mat-label>
<input matInput
[attr.maxlength] = "MaxLength"
[value]="Value ? Value : ''"
[placeholder]="PlaceHolder ? PlaceHolder : ''"
[type]="type ? type: 'text'"
(input)="onChange($event.target.value)"
>
</mat-form-field>
</div>

试图将此答案与“Angular Material ”文本框中的自然错误样式结合在一起,
Inheriting validation using ControlValueAccessor in Angular

最佳答案

我有同样的问题。我尝试了所有,然后终于可以使用此方法解决:

我在自定义组件上添加了此监听器。您也可以将其“模糊”事件。

@HostListener('focusout', ['$event.target'])
onFocusout() {
this.onTouched();
}

并在设置任何值时调用onTouched。
 writeValue(value: any) {
this.onTouched();
this.Value = value ? value : '';
}

关于angular - Angular Material 中具有错误验证的ControlValueAccessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59086347/

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