Categories
Angular Answers

How to create a custom form input with Angular?

Spread the love

Sometimes, we want to create a custom form input with Angular.

In this article, we’ll look at how to create a custom form input with Angular.

How to create a custom form input with Angular?

To create a custom form input with Angular, we can create a component that implements the ControlValueAccessor class.

For instance, we write

import { Component, Provider, forwardRef, Input } from "@angular/core";
import {
  ControlValueAccessor,
  NG_VALUE_ACCESSOR,
  CORE_DIRECTIVES,
} from "@angular/common";

const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = new Provider(NG_VALUE_ACCESSOR, {
  useExisting: forwardRef(() => InputField),
  multi: true,
});

@Component({
  selector: "inputfield",
  template: `<input [(ngModel)]="value" />`,
  directives: [CORE_DIRECTIVES],
  providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR],
})
export class InputField implements ControlValueAccessor {
  private _value: any = "";
  get value(): any {
    return this._value;
  }

  set value(v: any) {
    if (v !== this._value) {
      this._value = v;
      this.onChange(v);
    }
  }

  writeValue(value: any) {
    this._value = value;
    this.onChange(value);
  }

  onChange = (_) => {};
  onTouched = () => {};
  registerOnChange(fn: (_: any) => void): void {
    this.onChange = fn;
  }
  registerOnTouched(fn: () => void): void {
    this.onTouched = fn;
  }
}

to create the InputField class.

In it, we have a getter and setter to get the set the input value respectively.

In the template, we have an input that binds the input value to the value variable.

Also, we add the registerOnChange and registerOnTouched methods, to add the change and touch event functions.

We also set providers to [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR] so that we can use the component as a custom input that can bind to input values in template and reactive forms.

Conclusion

To create a custom form input with Angular, we can create a component that implements the ControlValueAccessor class.

By John Au-Yeung

Web developer specializing in React, Vue, and front end development.

Leave a Reply

Your email address will not be published. Required fields are marked *