По крайней мере, по моему опыту, я нашел два ответа здесь проницательными, но не работал сам по себе: из Thierry Templier (с первым комментарием), а из cal .
Я собрал части обоих, и придумал эту версию, которая теперь работает с 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
.
Edit: простой пример использования из HTML-кода с использованием такой директивы:
SystemVerilog не допускает частичный массив параметров (т. Е. Просто присваивает один индекс массиву параметров). Вы можете назначить только весь массив сразу:
MEM_MODEL_WRAPPER #(.MEM_AT_CS('{NONE, NONE, SSRAM_X16, NONE, NONE, NONE, NONE, NONE})) mem_dut(mem_intf , mc_clk);