ControlValueAccessor自定义Angular表单Input控件

介绍

自定义Input组件,实现FormControl;

核心内容(ControlValueAccessor)

1. 给组件 注册 NG_VALUE_ACCESSOR 提供者

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

2. 实现 ControlValueAccessor 接口

export class InputComponent implements OnInit, ControlValueAccessor {
  ...
  constructor() { }
 
  ngOnInit() {
  }
  
  registerOnChange(fn: any): void {
  }

  registerOnTouched(fn: any): void {
  }

  setDisabledState(isDisabled: boolean): void {
  }

  writeValue(obj: any): void {
  }
}

细节

/* 视图层 html */
<input type="text" [ngModel]="value" (ngModelChange)="_onChange($event)"  [placeholder]="pla"
	[readOnly]="!!readOnly" (blur)="blur.emit($event)">

/* 逻辑层 */
value = '';
@Input() pla = '';
@Input() readOnly;
@Output() blur: EventEmitter<any> = new EventEmitter();

// 值改变的时候调用该函数,并传值
private _onChange(_: any) {}
constructor() { }

ngOnInit() {}

// 这里把formControl的回调函数绑定到 _onChange
registerOnChange(fn: any): void {
  this._onChange = fn;
}

// 处理用户交互(我没用到,也不需要)
registerOnTouched(fn: any): void {
}

// 禁用表单组件(这里我没用到,感觉就是相当于在input标签里加上 disabled)
setDisabledState(isDisabled: boolean): void {
}

// 处理传入的数据值
writeValue(obj: any): void {
  this.value = obj;
}

结尾

这样就可以实现该组件的[(ngModel)]以及FormGroup;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular 表单验证是一种在 Web 应用程序中对用户输入进行验证的方法。它可以防止用户在提交表单之前输入不正确的数据。在 Angular 中,表单验证是通过构建验证器函数并将其应用于表单控件来完成的。以下是一个简单的例子,演示如何在 Angular 中应用表单验证: 1. 在 HTML 模板中定义表单: ```html <form (ngSubmit)="onSubmit()" #myForm="ngForm"> <label> Name: <input type="text" name="name" ngModel required> </label> <label> Email: <input type="email" name="email" ngModel required email> </label> <button type="submit" [disabled]="!myForm.form.valid">Submit</button> </form> ``` 2. 在组件中定义验证器函数: ```typescript import { Component } from '@angular/core'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; @Component({ selector: 'app-form', templateUrl: './form.component.html', styleUrls: ['./form.component.css'] }) export class FormComponent { myForm: FormGroup; constructor(private fb: FormBuilder) { this.myForm = this.fb.group({ name: ['', Validators.required], email: ['', [Validators.required, Validators.email]] }); } onSubmit() { console.log(this.myForm.value); } } ``` 在上面的代码中,我们使用 `FormBuilder` 创建了一个名为 `myForm` 的表单,并添加了两个控件:`name` 和 `email`。`name` 控件是必填的,而 `email` 控件则需要符合电子邮件格式。在 `onSubmit` 方法中,我们可以访问表单的值,并进行进一步的处理。 值得注意的是,为了让表单控件与模板中的 `ngModel` 指令进行绑定,我们需要在组件中导入 `FormsModule` 模块。在模板中,我们还使用了 Angular 的模板语法,如 `ngSubmit` 事件和 `[disabled]` 属性,来控制表单的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值