javascript - 在回调中输入事件的正确方法

标签 javascript angular typescript dom-events

两天前我开始挖掘 Angular,因为我将来可能需要使用它。

我目前正在研究从子组件到父组件的通信,我发现了几种实现此目的的方法,在以下每个示例中,ChildComponent 都具有此属性:

@Output changeSignal : EventEmitter = new EventEmitter<string>();

第一种方法

<input [(ngModel)]='message' (keyup)='handleKeyUp' />
message : string : '';

handleKeyUp() : void {
    this.changeSignal.emit(this.message);
}

这个解决方案让我们使用一个属性,该属性的唯一用途就是传输给父级,我不喜欢记住无用数据的想法。

第二种方式

<input (keyup)='handleKeyUp($event)' />
handleKeyUp(event : any) : void {
    this.changeSignal.emit(event.target.value);
    // console.log(event.constructor.name);
}

我们也可以不指定事件的类型,我不认为这在 typescript 中是一个好的做法。

第三种方式

上一个示例中的 console.log() 表示 KeyboardEvent 和 event.target 属于 EventTarget 类型,但该类似乎没有定义“value”属性。

handleKeyUp(event : KeyboardEvent) : void {
    // Error in the terminal
    this.changeSignal.emit(event.target.value);
}

“value”属性特定于某些 HTMLElement,例如 HTMLInputElement,为了防止错误,我们必须对其进行强制转换:

handleKeyUp(event : KeyboardEvent) : void {
    this.changeSignal.emit((<HTMLInputElement>event.target).value);
}

这感觉不太好。

第四种方式

<input (keyup)='handleKeyUp($event.target.value) />
HandleKeyUp(inputContent : string) : void {
    this.changeSignal.emit(inputContent);
}

我们让输入标签处理它的特殊性,但是 html 模板更难阅读并且包含应该在 javascript 文件中的行为。

您认为四种方法中哪一种是最佳实践?

最佳答案

你感觉如何

<input #nameInput (keyup)="handleKeyUp(nameInput.value)"/>

在 Angular 中,将轻量 DOM 和事件处理留在模板中(有时在指令中)被认为是一种很好的做法,这样你的 ts 就能够只包含与模型相关的逻辑。 您还可以创建一个发出绑定(bind) <input> 的指令如果您不喜欢我建议的方式,请为输出事件添加值

关于javascript - 在回调中输入事件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356121/

相关文章:

javascript - HTML 幻灯片代码

Javascript 分配 INNER HTML 并解析为 SVG 元素

angular - 如何在 Angular 的传单绘制中创建自定义控件?

javascript - 如何修复我的 Angular 4 路由

class - 是否可以在 typescript 中创建动态 getter/setter?

visual-studio - NuGet TypeScript 工具 :Why the added version of typescript compiler is still not available?

javascript - 第一次缩放时, Angular 图丢失数据

javascript - 如何从 Web 浏览器的控制台隐藏 ajax 请求

为生产而构建时,Angular 4 应用程序将无法运行

javascript - 在 Typescript 中,如何在存储然后从数组访问所述对象时维护对象类型?