我經過很多研究才形成這個解決方案。這是一種冒險的since the Angular team doesn't recommend extending DefaultValueAccessor
,但它自動地適用於每個輸入,而不必單獨標記每個輸入。
import { Directive, forwardRef, Renderer2, ElementRef, Input } from '@angular/core';
import { DefaultValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
export const VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => InputExtensionValueAccessor),
multi: true
};
@Directive({
selector: 'input:not([type]),input[type=text],input[type=password],input[type=email],input[type=tel],textarea',
host: {
'(input)': '_handleInput($event.target.value)',
'(blur)': 'onTouched()',
'(compositionstart)': '_compositionStart()',
'(compositionend)': '_compositionEnd($event.target.value)'
},
providers: [VALUE_ACCESSOR]
})
export class InputExtensionValueAccessor extends DefaultValueAccessor {
// HACK: Allows use of DefaultValueAccessor as base
// (https://github.com/angular/angular/issues/9146)
static decorators = null;
constructor(renderer: Renderer2, elementRef: ElementRef) {
super(renderer, elementRef, (null as any));
}
registerOnChange(fn: (_: any) => void): void {
super.registerOnChange(value => {
// Convert empty string from the view to null for the model
fn(value === '' ? null : value);
});
}
}
這對我在Angular 4.4.5上非常有用。
順便說一下,我知道我可以在提交或在我的字段中添加關鍵事件之前清理我的實體。但我想這樣做,而不用爲此編寫任何代碼。 – jobou
我不認爲有什麼會自動做到這一點。但是,您可以將ngModel分割爲值屬性和輸入事件的單獨綁定,如果值爲空字符串,只需將模型設置爲null即可。 –
如何創建一個內部使用'input'的組件,並在其中實現邏輯?這樣你就不需要每次都寫。 –