加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用Angular重置自定义表单控件

发布时间:2020-12-17 17:34:32 所属栏目:安全 来源:网络整理
导读:我有一个自定义表单控件与验证.我在其中使用一个独立的FormControl来处理值和一些验证. 当控件从另一个FormGroup重置时,Angular有没有办法重置内部FormControl? 贝娄是我的自定义表格控件.我希望能够重置durationControl. duration.component.ts import { C
我有一个自定义表单控件与验证.我在其中使用一个独立的FormControl来处理值和一些验证.

当控件从另一个FormGroup重置时,Angular有没有办法重置内部FormControl?

贝娄是我的自定义表格控件.我希望能够重置durationControl.

duration.component.ts

import { ChangeDetectionStrategy,Component,Input,OnInit,Optional,Self } from '@angular/core';
import { AbstractControl,ControlValueAccessor,FormControl,NgControl,ValidationErrors,Validators } from '@angular/forms';
import { Observable } from 'rxjs';
import { map,startWith,tap } from 'rxjs/operators';
import { Regex } from '../../constants';

@Component({
    selector: 'my-duration',templateUrl: 'duration.component.html',changeDetection: ChangeDetectionStrategy.OnPush
})
export class DurationComponent implements ControlValueAccessor,OnInit {
    @Input() required: boolean;

    durations: string[] = [
        '15m','30m','45m','1h','1h 15m','1h 30m','1h 45m','2h'
    ];
    filteredDurations: Observable<string[]>;

    durationControl = new FormControl('',[
        Validators.required,Validators.pattern(Regex.duration),DurationComponent.zeroDurationValidator
    ]);

    constructor(
        @Self()
        @Optional()
        public ngControl: NgControl
    ) {
        if (ngControl) {
            ngControl.valueAccessor = this;
        }
    }

    static zeroDurationValidator(control: AbstractControl): ValidationErrors {
        return control.value === '0m' ||
            control.value === '00m' ||
            control.value === '0h' ||
            control.value === '00h' ||
            control.value === '0h 0m' ||
            control.value === '0h 00m' ||
            control.value === '00h 00m' ||
            control.value === '00h 0m'
            ? { zeroDurationError: true }
            : null;
    }

    onChangeCallback = (value: string) => {};
    onTouchCallback = () => {};

    ngOnInit(): void {
        this.initializeFilters();
    }

    initializeFilters() {
        this.filteredDurations = this.durationControl.valueChanges.pipe(
            tap(value => this.onChangeCallback(value)),map(value => this.filterDurations(value))
        );
    }

    onBlur() {
        this.onTouchCallback();
    }

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

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

    writeValue(obj: any): void {
        this.durationControl.setValue(obj,{
            emitModelToViewChange: true
        });
        this.onChangeCallback(obj);
    }

    private filterDurations(value: string) {
        return this.durations.filter(duration => duration.indexOf(value) === 0);
    }
}

duration.component.html

<mat-form-field>
    <input [formControl]="durationControl"
    type="text"
    matInput
    autocomplete="off"
    [placeholder]="'DURATION' | translate"
    [matAutocomplete]="durationAutocomplete"
    >
    <mat-error *ngIf="durationControl.hasError('required')">{{ 'FORM_VALIDATION.REQUIRED' | translate }}</mat-error>
    <mat-error *ngIf="durationControl.hasError('pattern')">{{ 'FORM_VALIDATION.INVALID_FORMAT' | translate }}</mat-error>
    <mat-error *ngIf="durationControl.hasError('zeroDurationError')">{{ 'FORM_VALIDATION.ZERO_DURATION_ERROR' | translate }}</mat-error>

    <mat-autocomplete #durationAutocomplete="matAutocomplete">
        <mat-option *ngFor="let duration of filteredDurations | async" [value]="duration">
            {{ duration }}
        </mat-option>
    </mat-autocomplete>
</mat-form-field>

解决方法

重置表单时,所有控件都在writeValue方法中接收null.然后我可以像这样重置durationControl:

writeValue(obj: any): void {
    if (obj === null) {
        this.durationControl.reset();
    }

    this.durationControl.setValue(obj,{
        emitModelToViewChange: true
    });
    this.onChangeCallback(obj);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读