import { Component, forwardRef } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; import { CustomInputComponent } from './../../_abstract/custom-input.component'; @Component({ selector: 'app-multiline', templateUrl: './multiline.component.html', styleUrls: ['./multiline.component.scss'], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultilineComponent), multi: true } ] }) export class MultilineComponent extends CustomInputComponent { exposeMetaInTemplate: string[] = ['maxLineLength']; linesArr: string[]; value: string; public writeValue(value: any): void { this.value = value; this.splitIntoLines(value, this.meta.lines || 5); } private updateValue(): void { this.value = this.recombineLines(this.linesArr); this.propagateChange(this.value); } private splitIntoLines(value: string, numLines: number): void { this.linesArr = this.control.value.split(/\n/); if (this.linesArr.length < numLines) { const shortfall = numLines - this.linesArr.length; this.linesArr = [...this.linesArr, ...Array(shortfall).fill('')]; } else { this.linesArr = this.linesArr.slice(0, numLines); } } private recombineLines = (linesArr: string[]): string => { return linesArr.join('\n'); } private trackByFn(index: any, item: any) { return index; } }