2011-06-11 27 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

相关问题