我在使用TypeScript / JavaScript
时遇到问题我有一个像这样的函数数组
private listeners: ((name: string) => void)[] = [];
我在另一个似乎有用的功能中添加了功能。
现在我想在按下按钮时调用这些功能
button.onclick = function(){
this.listeners.forEach((callback) => callback(username));
}
如果我以这种方式尝试我的代码没有任何反应,我打赌这是因为它不知道listeners
。
我的下一次尝试是
button.onclick = function(listeners){
listeners.forEach((callback) => callback(username));
}
现在tsc告诉我
错误TS2339:属性' forEach'类型' MouseEvent'。
上不存在
我打赌我在这里错过了一个类型,但是如何告诉他这个数组是((name: string) => void)[] = [];
类型的函数数组
如果有人知道快速的解决方法,那会很酷。
在你问之前:我确定我的函数为我的数组添加了函数(至少在listerns
大小的add函数中更大):D
答案 0 :(得分:0)
尝试定义这样的onclick处理程序,使'this'指向当前的类实例:
private onClick(ev)
{
this.listeners.forEach((callback) => callback(username));
}
//Then somewhere later
button.onclick = (ev) => this.onClick(ev);
答案 1 :(得分:0)
您的主要问题是this
未提及您的预期背景。相反,this
指的是您的点击处理程序的MouseEvent
上下文。
作为您问题的简单解决方案,您可以使用Function.prototype.bind()
。
更改
button.onclick = function(){
this.listeners.forEach((callback) => callback(username));
}
到此
button.onclick = function(){
this.listeners.forEach((callback) => callback(username));
}.bind(this);
基本解释:
bind()方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。
答案 2 :(得分:0)
处理问题的一种更复杂的方法是根本不使用Debug.Log
,而是使用onclick
,并且您可以使用以下鲜为人知的方法来传递带有{{{的对象1}}方法到addEventListener
,这使handleEvent
所有问题都成了问题:
addEventListener
答案 3 :(得分:0)
感谢你们的好处
我认为函数的直接添加不会起作用,因为它是一个Eventhandler函数,它在代码中的某处工作但不在我定义它的位置。我改为addeventhandler并在我的函数中定义了一个函数,并为调用它应该调用的函数的Eventhandler调用一个新函数。#funcception:D
let triggerOnClick = () => {
let username = tf_name.value;
this.listeners.forEach((callback) => callback(username));
};
btn_enter.addEventListener("click", () => {
triggerOnClick();
});
该代码有效:)