在JQuery中使用Typescript我创建一个对话框,然后将点击事件附加到窗口标题中的两个按钮和“X”。每次用户需要打开对话框时,代码实际上都会创建一个新的SettingDlog对象,但绑定的单击事件似乎会为用户选择显示“设置”对话框后的每个时间添加一个附加事件。附加事件处理程序在哪里?为什么它存在?
我想也许点击事件被添加到DOM对象,因为它是独立的typescript类(JavaScript对象),但我不能在DOM浏览器中看到它,所以我不认为这是正确的。
作为一个解决方案,我明确地删除事件处理程序时,它被调用,但我不明白为什么我必须这样做,因为我每次创建一个新的SettingDlog对象。
代码显示对话框:
let myDlog = new SettingsDlog();
myDlog.closedCallback = "settingsDlog_Closed";
myDlog.show();
然后在show()方法的SettingsDlog我:
show() {
$('#closeX').click({ isOK: false }, this.onClose.bind(this))
$('#btnCancel').click({ isOK: false }, this.onClose.bind(this))
$('#btnOK').click({ isOK: true }, this.onClose.bind(this));
}
最后,当用户点击任意三个UI元素的关闭对话框调用设置对话框的onClose()方法:
onClose(event) {
this.dialogResult = event.data.isOK;
if (!AppHelper.isNullOrEmpty(this._closedCallback))
MainPage[this._closedCallback](this);
}
最后是_c losedCallback被称为该对象的MainPage:
settingsDlog_Closed(sender: SettingsDlog) {
if (!sender.dialogResult)
return;
// if here do something useful...
}
当我把一个破发点中settingsDlog_Closed和我点击以显示设置对话框第二次(或第三...)它充当如果第二(或第三)点击事件正在被添加。
这是我加入到SettingsDlog的onClosed方法作为一种解决方法的代码:
$('#closeX').off('click');
$('#btnCancel').off('click');
$('#btnOK').off('click');
有人可以帮助我理解这种奇怪的行为?
_“我每次创建一个新的SettingDlog对象”_,除非您的类正在销毁并重新创建元素,元素会像添加的事件侦听器一样留在DOM中,因此为什么必须将它们关闭 –
show()中的行看上去与此类似: $('#closeX')。click({isOK:false},()=> this.onClose) If it works,I将解释为什么:) – Granga
@PatrickEvans类SettingsDlog是一个打字稿类(JavaScript对象),它存在与DOM进行交互。正如我所说我认为这是在DOM中,但它没有被附加。我查看DOM元素的onClick方法,并在附加click事件后为空。 – MtnManChris