当我触发事件时,如何将参数传递给事件处理程序?

时间:2011-06-11 19:07:53

标签: jquery script#

在脚本#中,我有以下内容:

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)

因此,当调用处理程序时,无法找到args。

我已经阅读了有关在jQuery api文档(http://api.jquery.com/trigger)上将参数传递给事件处理程序的其他方法,并且它们似乎在脚本#中不可能。

2 个答案:

答案 0 :(得分:2)

添加DuckMaestro的建议 -

Script.jQuery的源代码在github上......它们就在那里,所以人们可以改变它,不会被阻止,也不必诉诸于InvokeMethod,Script.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 :(得分: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