#angular #directive
#angular #директива
Вопрос:
Я пытаюсь добавить атрибут в поле ввода, если какой-либо текст вводится с помощью пользовательской директивы. Я могу сделать это в событии @HostListener (‘change’). Это прекрасно подходит для страницы создания, однако на странице редактирования данные загружаются асинхронно и привязываются через ngModel, поэтому я не смог найти ни одного события для этого. Любая помощь будет оценена.
@Directive({
selector: '[testDirective]'
})
export class TestDirective implements AfterViewInit{
constructor(private el: ElementRef) { }
@HostListener('change') onChange() {
this.setCustomAttribute();
}
@HostListener('input') inputEvent() {
console.log("i am in input event");
//input event is not working either
}
private setCustomAttribute(){
if(this.el.nativeElement.value==null||this.el.nativeElement.value==""){
this.el.nativeElement.setAttribute("custom-attribute", "false");
}else{
this.el.nativeElement.setAttribute("custom-attribute", "true")
}
}
}
<input testDirective name="somefield" required type="text" [(ngModel)]="object.somefield">
Комментарии:
1. Попробуйте в
ngOnInit()
Ответ №1:
вы можете ввести «ngControl» внутри своей директивы, а затем присоединить к valueChanges следующим образом
@Directive({
selector: '[testDirective]'
})
export class TestDirective implements AfterViewInit{
constructor(private el: ElementRef,private ngControl:NgControl) {
this.listenToChanges();
}
private listenToChanges(){
this.ngControl.valueChanges.subscribe(()=>{
this.setCustomAttribute(); })
}
@HostListener('change') onChange() {
this.setCustomAttribute();
}
@HostListener('input') inputEvent() {
console.log("i am in input event");
//input event is not working either
}
private setCustomAttribute(){
if(this.el.nativeElement.value==null||this.el.nativeElement.value==""){
this.el.nativeElement.setAttribute("custom-attribute", "false");
}else{
this.el.nativeElement.setAttribute("custom-attribute", "true")
}
}
}
<input testDirective name="somefield" required type="text" [(ngModel)]="object.somefield">
и он автоматически откажется от подписки, в то время как директива будет уничтожена
Комментарии:
1. событие ввода не работает, когда данные привязаны к ngModel, я соответствующим образом обновил свой вопрос
2. если у вас есть ngModel, вы можете ввести ngControl в свой конструктор директив и подписаться на событие valueChanges
3. спасибо за ответ, ваше решение работает. Не могли бы вы уточнить свой ответ? на что именно я подписался и должен ли я отказаться от подписки при смене страницы? @onik
Ответ №2:
попробуйте метод ngAfterViewInit
ngAfterViewInit(): void {
if(this.el.nativeElement.value==null||this.el.nativeElement.value==""){
this.el.nativeElement.setAttribute("custom-attribute", "false");
}else{
this.el.nativeElement.setAttribute("custom-attribute", "true")
}
}
Комментарии:
1. здравствуйте, я пробовал это, но данные также могут быть загружены после метода ngAfterViewInit, если сервер работает медленно