angular 自定義元件和form的formControlName 連用
阿新 • • 發佈:2021-06-21
效果預覽
TS程式碼
import { Component, forwardRef, Input, OnInit } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Component({ selector: 'app-number-plus-subtract', templateUrl: './number-plus-subtract.component.html', styleUrls: ['./number-plus-subtract.component.scss'], providers: [{ provide: NG_VALUE_ACCESSOR, multi: true, useExisting: forwardRef(() => NumberPlusSubtractComponent) }] }) export class NumberPlusSubtractComponent implements OnInit, ControlValueAccessor { inputValue = 1; // 初始值 @Input() defaultValue: number; // 預設值 @Input() min: number; // 最小值 @Input() max: number; // 最大值 @Input() step: number; // 遞增/遞減步數 @Input() dsiabled: boolean; // 是否可用 onChange: any = () => { }; onTouch: () => void = () => null; constructor() { } // 封裝元件搭配form的formControlName 使用 writeValue(obj: any): void { this.inputValue = obj; } registerOnChange(fn: any): void { this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouch = fn; } countSubtract() { if (this.dsiabled) { return; } if ((this.min || this.min === 0) && this.min >= (this.inputValue - this.step)) { this.inputValue = this.min; return; } this.inputValue = this.inputValue - this.step; this.onChange(this.inputValue); } countPlus() { if (this.dsiabled) { return; } if ((this.max || this.max === 0) && this.max <= (this.inputValue + this.step)) { this.inputValue = this.max; return; } this.inputValue += this.step; this.onChange(this.inputValue); } setDefaultInfo() { if (this.defaultValue || this.defaultValue === 0) { this.inputValue = this.defaultValue; } if (!this.step) { this.step = 1; } if (this.inputValue < this.min) { this.inputValue = this.min; } } ngOnInit() { this.setDefaultInfo(); } }
關鍵程式碼