2011-06-11 26 views
2

在腳本#,我有以下幾點:當我觸發事件時,如何將參數傳遞給事件處理程序?

jQuery.Select("#someId").Trigger("item-added", new object[]{"ball"}); 

這編譯成以下JavaScript:

$('#someId').trigger('item-added', [ 'ball' ]); 

上面的代碼工作正常。問題出現在聲明可以接收參數數組的事件處理程序中。

爲了讓我的處理程序來接收參數數組,就必須有一個簽名,例如:

public void OnItemAdded(jQueryEvent jqe, Object[] args) 

然而,唯一可用的類型是:

public delegate void jQueryEventHandler(jQueryEvent e) 

正因爲如此,當處理程序被調用時,參數無處可尋。

我讀過關於將參數傳遞給jQuery api文檔(http://api.jquery.com/trigger)上的事件處理程序的其他方法,並且它們在腳本#中似乎不可行。

+0

考慮使用封閉 - - 它可能不是「最好」的答案,但它應該起作用。 (我只能希望Script#知道如何生成閉包;-) – 2011-06-11 19:13:12

+1

抱怨'Script#'應該實現這個功能。你可以嘗試猴子補丁'trigger'和'bind',但上帝知道你會如何在'Script#'中做到這一點 – Raynos 2011-06-11 19:18:31

+2

另外一個偷偷摸摸的建議,如果你有機會學習js而不是用最後期限。 – Raynos 2011-06-11 19:25:53

回答

2

添加到DuckMaestro的建議 -

爲Script.jQuery來源是在github上......他們是有這樣的人可以改變它,不會被阻止,而不必求助於之類的InvokeMethod,腳本.Literal和其他此類次優解決方案。

簽名不是這樣開始的原因是每個事件處理程序不需要在不需要時在其簽名中定義額外的參數。

選項1 -

創建一個不同的委託簽名 - 像jQueryEventHandler。然後創建使用新簽名的Bind和Trigger的重載。它並不難,尤其是。如果您將現有實現源作爲參考。

選項2 -

使用在http://api.jquery.com/trigger,通過實施例所建議的其它圖案。

var event = jQuery.Event("item-added"); 
event.item = "ball"; 
$("#someid").trigger(event); 

具體屬性添加到jQueryEvent,然後在其上創建的派生類,你觸發事件,設置屬性爲您的具體方案。然後在事件處理程序中將jQueryEvent轉換回特定的類型。

關於這一點的好處是它與DOM ...一致,就你用document.createEvent和dispatchEvent所做的事情而言。因此,我更喜歡這個選項,除了它不需要爲每個特定場景重載綁定/觸發器。

你現在會碰到的一件事是jQueryEvent本身現在被封了,但我很樂意讓它解封以支持這些場景(確保在github上記錄一個bug,以便跟蹤它)。與此同時,您還有資源可以在您的最終解封。

如果你真的不想進入重建Script.jQuery,一個臨時的解決方法(直到你有一個構建在那裏你可以開始從派生)如下:

jQueryEvent e = jQuery.Event("item-added"); 
Script.Literal("{0}.item = {1}", e, "ball"); 
1

您有幾種選擇,但阻力最小的路徑可能是做到以下幾點:

void OnItemAdded(jQueryEvent e, Object[] args) { /* your handler */ } 

// ... 

    jQueryObject myElement = jQuery.Select("#someId"); 
    Type.InvokeMethod(myElement, "bind", "item-added", new Action<jQueryEvent, Object[]>(OnItemAdded)); 

// ... 

另一種選擇是子類jQueryObject,添加一個新的委託類型,和一個新的簽名Bind該把你的委託。順便說一下,除非需要傳遞參數數組,否則可以使用Object而不是Object[]來排除數組語法;或者更好的是,如果你知道你的傳入參數可以嚴格是一個字符串,那麼只需使用string

相關問題