【问题标题】:Angular2: Directive loads, but does nothingAngular2:指令加载,但什么也不做
【发布时间】:2017-08-26 05:55:50
【问题描述】:

编辑:我发现了问题。你知道结果是什么吗? chrome 缓存问题。 Chrome 缓存了一些东西,直到我在调试器打开并明确刷新我的页面时关闭缓存,我一无所获。刷新后,我开始捕捉事件。

原帖: 我有一个自定义 Angular 指令,它应该作用于三个事件中的任何一个的控件:onloadonbluronfocus。它应用于input 控件,该控件可能会或可能不会被禁用。我知道onbluronfocus 在禁用控件上是无用的,但我认为监听从未出现的事件并没有什么坏处。另一方面,启用的控件将触发这些事件,所以我需要监听。该指令被设计为相当通用,因此它需要同时处理禁用和启用的input 控件。

问题是,它什么也没做。至少,它似乎没有做任何事情。该指令被实例化——我已经验证了构造函数触发了,并且我已经验证了elementRef 指向一个输入控件——但仅此而已。没有一个监听器工作。

用法:

<input myDirective disabled id="someId" name="someName" [ngModel]="myValue" />

指令:

import { Directive, HostListener, ElementRef, Input } from "@angular/core";

@Directive({ selector: "[myDirective]" })
export class MyDirective {
    constructor(private elementRef: ElementRef) {
    }

    @HostListener("focus", ["$event.target.value"])
    onFocus(value: string) {
        console.log("MyDirective: Focus caught.");
    }

    @HostListener("blur", ["$event.target.value"])
    onBlur(value: number) {
        console.log("MyDirective: Blur caught.");
    }

    @HostListener("load", ["$event.target.value"])
    onLoad() {
        console.log("MyDirective: Load caught.");
    }
}

当我运行所有内容时,它加载正常。缺少模块、缺少组件等没有问题。控制台中没有错误。正如我之前提到的,即使使用调试器闯入代码也会验证指令是否已实例化。但我也没有控制台输出。我至少会期待它出现在onload 事件中。禁用input 控件是否不会触发这些或其他内容?

【问题讨论】:

  • 你在哪里提供这个指令以及你在哪里使用它(组件之间的关系)?
  • 你应该使用@HostBinding('value') 而不是带参数的方法。
  • @Fals:我不确定这会有什么帮助。这是一个简化版本——实际上,这只是一个测试,看看我是否能捕捉到我无法捕捉到的事件。我尝试将load 更改为valuechange,并且在未禁用的输入控件上进行了尝试。绝对没有任何反应——不是blur,不是focus,不是value/change/load;没有。我什至尝试处理 onInit 并仅输出控件的 ID 并获得 zip。 “id=未定义”。

标签: javascript html angular typescript


【解决方案1】:

onLoad 将不起作用,因为它是一个窗口事件而不是 表单事件

以下是表单元素可以处理的事件列表

onblur  
onchange
oncontextmenu   
onfocus 
oninput 
oninvalid   
onreset 
onsearch
onselect
onsubmit

你已经参考了这个documentation 根据评论更新

如您所料,MDN 链接支持上述答案here it is

资源事件是指互联网中的资源,例如网址。

【讨论】:

  • 一般而言,w3schools 并不是最好的学习场所。有很多事情没有被准确/正确地解释。 MDN 是一个更好的链接位置。
  • 因此,如果 onLoad 不起作用,并且似乎没有等效的表单事件,那么在显示控件时是否可以使用触发的事件?除了我的缩短版本,我试图在加载时在输入框中格式化一个值,但我需要知道它何时实际加载,不是吗?或者我可以在指令上使用 OnInit 并将 elementRef.target.value 设置为那里的格式化值吗?
  • 您希望什么时候发生这种情况?在组件加载期间将方法放入组件并处理它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2016-02-26
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多