少なくとも私の経験では、ここでの2つの回答は洞察力に富んでいますが、単独では機能していません。
私は両方の部分をまとめて、このバージョンを思いつきました。これは現在、リアクティブな形式で Angular 4.1.1 で動作しています。
import { Directive, Renderer, ElementRef, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, DefaultValueAccessor } from '@angular/forms';
const LOWERCASE_INPUT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => LowerCaseInputDirective),
multi: true,
};
@Directive({
selector: 'input[lowercase]',
host: {
// When the user updates the input
'(input)': 'onInput($event.target.value)',
'(blur)': 'onTouched()',
},
providers: [
LOWERCASE_INPUT_CONTROL_VALUE_ACCESSOR,
],
})
export class LowerCaseInputDirective extends DefaultValueAccessor {
constructor(renderer: Renderer, elementRef: ElementRef) {
super(renderer, elementRef, false);
}
writeValue(value: any): void {
const transformed = this.transformValue(value);
super.writeValue(transformed);
}
onInput(value: any): void {
const transformed = this.transformValue(value);
super.writeValue(transformed);
this.onChange(transformed);
}
private transformValue(value: any): any {
const result = value && typeof value === 'string'
? value.toLowerCase()
: value;
return result;
}
}
これは小文字用ですが、すべてが大文字にも当てはまります。ディレクティブの名前を変更し、 と 内で置き換えselector
ますtransformValue
。
編集:
そのようなディレクティブを使用した HTML コードからの簡単な使用例:
<input id="myField"
formControlName="myField"
type="text" class="form-control required"
lowercase>