2016-09-16 80 views
0

我有一個自定義小部件。該小部件具有連接到DOM節點的單擊事件的功能。後來我想將第二個函數連接到第一個函數。將函數引用或函數名稱傳遞給_Widget.connect()時的不同行爲

但是,這隻適用於如果我首先將函數名稱而不是函數引用傳遞到connect函數。

這將工作:

this.connect(this.domNode, 'onclick', 'onClick' /*<-- Function name*/); 
this.connect(this, 'onClick', 'onClick2'); 

這不會:

this.connect(this.domNode, 'onclick', this.onClick /*<-- Function reference*/); 
this.connect(this, 'onClick', 'onClick2'); 

Here是小提琴證明的行爲。當您點擊具有文本「功能名稱」的小部件時,將顯示兩個警報,當您使用文本「功能參考」單擊小部件時,只會顯示一個警報。

這是某種錯誤還是我誤解了某些東西?

回答

0

這不是一個錯誤,它是預期的行爲。你得到不同結果的原因是因爲Dojo如何維護「之前」和「之後」。首先讓我解釋一下這個調用的區別。

this.connect(this.domeNode, 'onclick', 'onClick');的情況下,您傳遞函數的字符串參數。在內部,它會調用類似this['onClick']()的東西,這裏的功能與小部件中的功能相同(範圍也保持不變,即小部件)。

在第二種情況下,您將函數參數作爲函數的實例傳遞(您也可以創建一個var functionParam = this.onClick並將其作爲參數傳遞,它將是相同的),因爲它已經是一個函數,dojo將執行類似於functionParameter()(這裏範圍將是小部件)。由於範圍&函數對於這兩種情況都是相同的,所以函數的執行方式或輸出結果沒有區別。

移動到感興趣的部分,當您設置另一個函數在執行原始函數後被調用。 Dojo必須將這些信息保存在某個地方,因此它會用一個包含所有信息(如after, before and original function)的對象/函數替換原始函數。它有一個機制來按順序執行它們。

所以要回答你的問題,第一種情況,dojo內部將執行它已經取代你的函數的方法,因此也會調用第二個函數。在第二種情況下,您傳遞的方法實例將被調用,而不是小部件的功能(widget.onClick),所以不會調用第二個函數。

也避免使用connect,這是一個不推薦的方法,內部將使用dojo/ondojo/aspect。您也可以使用它們並減少Dojo爲您提供的頭頂成本。

棄用,將在2.0中刪除,使用this.own(on(...))或 this.own(aspect.after(...))來代替。

+0

所以,你的意思是,當我將'onClick2'連接到'onClick'時,dojo用動態創建的函數替換'onClick',而在第二種情況下它不會替換'myWidget.onClick',而只是'functionParameter'? –

+0

我使用'connect',因爲這是仍然使用pre 1.7語法的遺留代碼。 –

+0

在這兩種情況下都沒有'myWidget.onClick'被替換。但是,僅在第一種情況下調用myWidget.onClick,而在第二種情況下調用functionParameter,這是您原始的「onClick」的實例。 –

相關問題