Проблема в том, что this.ngControl.valueAccessor.writeValue(newVal)
не запускает обновление модели. Не совсем уверен, почему это так, но вот альтернативный подход, который вы можете использовать с ElementRef
& dispatchEvent
для запуска обновления модели:
Сначала обновите значение ввода, используя ElementRef, а затем используйте dispatchEvent
.
this.el.value = newVal;
this.el.dispatchEvent(new Event('input'))
демо: https://stackblitz.com/edit/angular-slug-transform-sdmeto
Полностью обновленная директива:
import { Directive, HostListener, ElementRef, OnInit } from "@angular/core";
import { NgControl } from "@angular/forms";
@Directive({
selector: "[formControlName][appSlugTransform]"
})
export class SlugTransformDirective implements OnInit {
private el: any;
constructor(public ngControl: NgControl, private elementRef: ElementRef) {
this.el = this.elementRef.nativeElement;
}
ngOnInit() {
this.el.value = this.transform(this.el.value);
}
@HostListener("ngModelChange", [ "$event"])
onNgModelChange(event) {
let newVal = this.transform(event);
// this.ngControl.valueAccessor.writeValue(newVal);
this.el.value = newVal;
this.el.dispatchEvent(new Event('input'))
}
transform(value) {
let text = value.toLowerCase();
if (text.charAt(0) == " ") {
text = text.trim();
}
if (text.charAt(text.length - 1) == "-") {
//text = (text.replace(/-/g, ""));
}
text = text.replace(/ +/g, "-");
text = text.replace(/--/g, "-");
text = text.normalize("NFKD").replace(/[\u0300-\u036f]/g, ""); // Note: Normalize('NFKD') used to normalize special alphabets like óã to oa
text = text.replace(/[^a-zA-Z0-9 -]/g, "");
return text;
}
}
Другой подход, которыйВы можете попробовать использовать patchValue
вместо writeValue
, например:
this.ngControl.control.patchValue(newVal);
Это должно вызвать изменение модели. (не проверено)