2011-06-11 2 views
2

이벤트를 트리거 할 때 어떻게 이벤트 처리기에 인수를 전달할 수 있습니까?

스크립트 #에서는 다음과 같은 내용이 있습니다.

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

다음 자바 스크립트로 컴파일됩니다.

$('#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)에서 이벤트 처리기에 인수를 전달하는 다른 방법에 대해 읽었으며 스크립트 #에서 가능하지는 않습니다.

+0

는 클로저를 사용하는 것을 고려 - - "최상의"대답은 아니지만 작동해야합니다. (나는 단지 스크립트 #가 클로저를 생성하는 방법을 알고 있기를 바랄 수있다 ;-) –

+1

'Script #'가이 기능을 구현해야한다고 불평한다. 당신은 원숭이 패치'trigger'와'bind'를 시도 할 수 있습니다. 그러나'Script #'에서 어떻게 할 것인지 신이 알고 있습니다. – Raynos

+2

js를 배울 수있는 기회가 있다면 평범한 JavaScript 개발이 더 바람직합니다. 마감일. – Raynos

답변

2

- Script.jQuery에 대한

소스는 사람들이 InvokeMethod, 스크립트 같은 것들에 의존해야 차단, 그것을하지 변경 할 수 있도록 그들이 거기에있어 ... GitHub의에 있습니다 .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를 특정 유형으로 다시 캐스트합니다.

좋은 점은 document.createEvent 및 dispatchEvent를 사용하여 DOM의 내용과 관련이 있다는 점입니다. 따라서 나는 모든 특정 시나리오에 대해 바인딩/트리거의 오버로드가 필요 없다는 사실 외에도이 옵션을 선호합니다.

jQueryEvent 자체는 지금 당장 봉인됩니다.하지만 이러한 시나리오를 지원하도록 개봉하지 않으면 안됩니다 (github에 버그를 기록하여 추적 할 수 있도록하십시오). 차단되지 않은 시간에, 당신은 그것을 당신의 목적으로 개봉 할 수있는 근원을 가지고 있습니다.

당신이 정말로 (당신이에서 파생 시작할 수있는 빌드를 할 때까지) 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 만 사용하십시오. DuckMaestro의 제안에 추가

관련 문제