为什么更改事件不适用于输入?

用户名

我有以下输入元素:

 <input
        range
        [btnClass]="'close_input_button'"
        type="text"
        class="reset-border-right"
        formControlName="parentId1Name"
      />

如您所见,我使用指令:

 range [btnClass]="'close_input_button'"

指令看起来像:

@Directive({
  selector: "[range]"
})
export class RangeDirective implements OnInit {
   @HostListener("change", ["$event"]) ngOnChanges(value: any) {
    console.log(value);
  }
}

为什么当我使用反应形式为输入设置新值时,它会触发指令中的更改事件?

this.form.get("parentId1Name").setValue('New value');

完整的指令是:

import {
  Input,
  HostListener,
  OnInit,
  OnChanges,
  SimpleChanges
} from "@angular/core";
import { Renderer2 } from "@angular/core";
import { ElementRef } from "@angular/core";
import { Directive } from "@angular/core";

@Directive({
  selector: "[range]"
})
export class RangeDirective implements OnInit, OnChanges {
  constructor(private elementRef: ElementRef, private renderer: Renderer2) {}

  readonly _elements = ["INPUT", "SELECT", "TEXTAREA"];
  private newDomElement: any;

  @Input() btnClass: string;
  @Input() model: any;
  @Input() position: string = "right";

  ngOnInit(): void {
    const parent = this.elementRef.nativeElement.parentNode;
    const reference = this.elementRef.nativeElement;

    this.elementRef.nativeElement.parentNode.style.position = "relative";
    this.newDomElement = this.createButton();
    this.renderer.insertBefore(parent, this.newDomElement, reference);
  }

  @HostListener("keyup", ["$event"]) ngKeyup(value: any) {
    this.eventHandler(value);
  }

  @HostListener("change", ["$event"]) ngChange(value: any) {
    this.eventHandler(value);
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes.input) {
      console.log("input changed");
    }
  }

  eventHandler(value: any) {
    if (!value.srcElement) return;
    const _value = value.srcElement.value.toString().trim();
    if (_value) {
      this.newDomElement.style.display = "flex";
    } else {
      this.newDomElement.style.display = "none";
    }
  }

  createButton() {
    let closeButton = document.createElement("div");
    closeButton.innerHTML = '<i class="material-icons">clear</i>';
    closeButton.className = this.btnClass;
    closeButton.className += " " + this.position;
    closeButton.style.display = "none";
    closeButton.onclick = () => {
      closeButton.style.display = "none";
      this.elementRef.nativeElement.value = null;
    };

    return closeButton;
  }

}

维普尔

您需要输入的输入属性,然后使用ngOnChanges钩子告诉输入属性何时更改。

@Directive({
    selector: '[range]'
})
export class RangeDirective implements OnChanges {
    @Input() public range: any;
    @Input() public input: any;

    ngOnChanges(changes: SimpleChanges){
      if(changes.input){
        console.log('input changed');
      }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

“返回”不适用于输入类型文件的更改事件

离子2:为什么更改事件不适用于离子选择?

为什么加载事件的addEventListener不适用于div?

为什么 String.replace() 不适用于事件?

为什么ExtractMpegFramesTest不适用于旋转的输入文件?

为什么输入模式属性不适用于数字?

为什么工具提示动画适用于标签而不适用于输入

为什么提交输入样式既不适用于Safari(Mac)也不适用于Chrome,而仅适用于背景颜色?

如果文件名相同,则更改事件功能不适用于输入类型文件

为什么我的更改复选框不适用于js文件,但适用于控制台?

为什么文档选择器不适用于 mouseenter 事件?

为什么此Delegate约束不适用于定义事件?

为什么 WorkSheet_Change 事件不适用于多行

更改事件不适用于角度4中的跨度

jQuery更改事件不适用于复选框

为什么带有输入类型文本的日期管道不适用于angular2?

为什么条件渲染不适用于vue.js中的表单输入

为什么sqrt函数不适用于通过用户输入获取的值?

为什么此Dijkstra算法不适用于此特定输入?

为什么Java CRLF令牌不适用于批处理文件输入?

为什么预先输入不适用于此MVC5应用程序?

为什么empty() 不适用于搜索栏中的输入?

为什么错误处理不适用于“无”输入?

为什么这个检查平衡括号的代码不适用于输入'(})'?

为什么我的函数适用于矩阵但为什么不适用于向量?

动态更改不适用于 vuejs 输入

jQuery addClass 不适用于动态更改的输入

为什么我的 jquery .on('change') 不适用于动态更改的行

为什么从{3}更改为{4}不适用于此正则表达式?