2016-04-29 32 views
0

在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'); 

有人可以帮助我理解这种奇怪的行为?

+0

_“我每次创建一个新的SettingDlog对象”_,除非您的类正在销毁并重新创建元素,元素会像添加的事件侦听器一样留在DOM中,因此为什么必须将它们关闭 –

+0

show()中的行看上去与此类似: $('#closeX')。click({isOK:false},()=> this.onClose) If it works,I将解释为什么:) – Granga

+0

@PatrickEvans类SettingsDlog是一个打字稿类(JavaScript对象),它存在与DOM进行交互。正如我所说我认为这是在DOM中,但它没有被附加。我查看DOM元素的onClick方法,并在附加click事件后为空。 – MtnManChris

回答

相关问题