2015-12-07 62 views
2

在Javascript中,我看到已有一個Event界面和一個名爲CustomEvent的子項。我想知道這些是否適合c#類型的event/delegate系統。我想創建一種訂閱事件的方式,但是我遇到了如何優雅地退訂。通用Javascript事件

function MyClass(){ 
    this.onDoCoolThing = null; 
} 

MyClass.prototype.doCoolThing = function(){ 
    // do thing 
    if(this.onDoCoolThing !== null){ 
     for(var i = 0; i < this.onDoCoolThing.length; i++){ 
      if(this.onDoCoolThing[i] instanceof Function) 
       this.onDoCoolThing[i](); 
     } 
    }  
} 

首先,我該如何訂閱?這是我的想法:

C#方法

var myClass = new MyClass(); 
myClass.onDoCoolThing += myCallbackFunction.bind(this, param1); 
myClass.onDoCoolThing += myOtherCallbackFunction.bind(this, param1); 

陣列風格 如果C#方法是不可能的:

myClass.onDoCoolThing.push(myCallBackFunction.bind(this, param1); 

我不知道我怎麼會從取消那些如果讓我們說,帶回調的對象被銷燬了。它會被GCed?

這就是爲什麼我想知道這項工作是否已經完成並在本地對象中找到,但我沒有真正看到它的任何地方。

+0

我不清楚你在問什麼..你只是想綁定/解除綁定事件的功能?或者,除此之外還有更多。 – acupajoe

+1

從[本文]開始(https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events) – hindmost

+0

@acupajoe我試圖重新創建C#事件(Java可能具有相同的功能) 。我想要一種方法來訂閱對象事件,並取消訂閱。我應該能夠控制何時觸發這些事件(即在一個函數範圍內) – BarryBones41

回答

1

在香草JS中沒有辦法乾淨地做它。

但是,jQuery提供了一個委託方法,因此您可以在DOM加載後分配處理程序。只需拉入jQuery庫。你可以手動編寫一個函數在Vanilla JS中完成它,但讓jQuery爲你處理它更容易。

http://api.jquery.com/delegate/

+1

「如果這項工作已經完成並且在**原生**對象中找到」 – acupajoe

+0

在vanilla JS中沒有任何方法可以提供委託的分配。你必須自己寫。我正在提供一種更快捷的方式。就我所見,在JS中做到這一點的方式並不是很好的支持跨客戶端。 – Korgrue

+1

我意識到這一點,只是提供了一個原因,爲什麼你被低估。他要求一種本地方式來實施它。如果沒有原生的方法去做,應該在提供替代方案之前在答案中說明。 – acupajoe