Как я могу передать аргументы обработчику события, когда я запускаю событие? - PullRequest
2 голосов
/ 11 июня 2011

В 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)

И поэтому при вызове обработчика аргументы нигде не найдены.

Я читал о других методах передачи аргументов в обработчики событий в jQuery api docs (http://api.jquery.com/trigger) и они не кажутся возможными в сценарии №.

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Добавление к предложению 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.Поэтому я предпочитаю эту опцию, помимо того факта, что для каждого конкретного сценария не требуется перегрузок bind / trigger.

Одна вещь, с которой вы столкнетесь прямо сейчас, - это то, что сам jQueryEvent запечатан прямо сейчас,но я рад сделать это распечатанным для поддержки этих сценариев (обязательно зарегистрируйте ошибку на github, чтобы ее можно было отслеживать).Тем временем, чтобы быть разблокированным, у вас есть источники, чтобы сделать его распечатанным на вашем конце.

Если вы действительно не хотите переходить к перестройке Script.jQuery, временного обходного пути (пока у вас нетпостроить, откуда вы можете начать производную) следующее:

jQueryEvent e = jQuery.Event("item-added");
Script.Literal("{0}.item = {1}", e, "ball");
1 голос
/ 12 июня 2011

У вас есть несколько вариантов, но путь наименьшего сопротивления, вероятно, заключается в следующем:

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, если вы знаете, что входящий аргумент может быть строго строкой.

...