Microsoft AJAX Library_이벤트 노출
■ 객체에서 이벤트 노출하기
Microsoft Ajax Library는 클라이언트 객체가 자신의 이벤트를 노출할 수 있도록 이벤트 모델을 제공하고 있는데, 이는 .NET Framework와 유사하다.
객체에서 이벤트를 노출하려면 아래의 작업이 필요하다.
1. 이벤트 핸들러 추가를 담당하는 메서드 생성하기
2. 이벤트 핸들러 제거를 담당하는 메서드 생성하기
3. 이벤트를 발생시키는 메서드 생성하기
이때 주의할 점은 아래와 같다.
○ 이벤트 핸들러를 추가하는 역할을 담당할 메서드의 이름은 반드시 add_이벤트명 형식이어야 한다.
○ 이벤트 핸들러를 제거하는 역할을 담당할 메서드의 이름은 반드시 remove_이벤트명 형식이어야 한다.
예를 들어 객체에서 intialize라는 이벤트를 노출하고 싶다면, add_intialize 와 remove_initialize 라는 메서드를 생성해야 한다.
Microsoft Ajax Library를 이용해 객체는 이벤트를 노출할 수 있다. add_이벤트명, remove_이벤트명 메서드가 이벤트 핸들러를 추가하고 제거하는데 사용된다. 그리고 내부적으로는 _raiseEvent 식의 이름의 함수로서 이벤트를 발생시킬 수 있을 것이다. (반드시 _raiseEvent라는 이름을 사용해야 하는 것은 아니다)

여러 개의 이벤트 핸들러를 관리하기 위해서, Microsoft Ajax Library에서는 Sys.EventHandlerList 라는 클래스를 제공하는데, 이는 여러 이벤트에 대한 이벤트 핸들러를 저장하는데 사용되는 객체를 캡슐화한 것이다. (배열을 랩핑한 컬렉션 클래스이다.)
아래의 샘플 예제를 보면서 이해하도록 하자.
□ 클래스 정의 및 이벤트 노출 (이벤트 제공자 측)
Type.registerNamespace('Samples');
Samples.Collection = function() {
this._innerList = [];
// 이벤트 핸들러 목록
this._events = null;
}
Samples.Collection.prototype = {
// 이벤트 발생을 유발시키는 일반 메서드 : 항목을 추가하는 메서드로 내부적으로 항목추가(itemAdded) 이벤트를 발생시킨다.
add : function(member) {
this._innerList.push(member);
this._raiseEvent('itemAdded', Sys.EventArgs.Empty);
},
// 이벤트 핸들러 목록 조회용 함수
get_events : function() {
if(!this._events) {
// 이벤트 핸들러 목록이 비어 있을 경우에는 새로운 Sys.EventHandlerList 객체를 생성하여 할당
this._events = new Sys.EventHandlerList();
}
return this._events;
},
//이벤트 핸들러 추가를 담당하는 메서드
add_itemAdded : function(handler) {
this.get_events().addHandler('itemAdded', handler);
},
//이벤트 핸들러 제거를 담당하는 메서드
remove_itemAdded : function(handler) {
this.get_events().removeHandler('itemAdded', handler);
},
//이벤트를 실제로 발생시키는 내부 함수
_raiseEvent : function(eventName, eventArgs) {
var handler = this.get_events().getHandler(eventName);
if (handler) {
if (!eventArgs) {
eventArgs = Sys.EventArgs.Empty;
}
handler(this, eventArgs);
}
}
}
Samples.Collection.registerClass('Samples.Collection');
□ 이벤트 구독과 이벤트 핸들러 구현(이벤트 소비자: 클라이언트 측)
Collection 클래스에 의해 발생하는 itemAdded 이벤트를 구독하기 위해 Collection객체의 add_itemAdded 메서드에 JavaScript 함수를 전달한다. 이 함수가 itemAdded 이벤트에 대한 이벤트 핸들러가 된다. 동일한 함수를 remove_itemAdded 메서드에 전달하면 해당 함수가 이벤트 핸들러 목록에서 제거된다.
그리고 마지막으로 Collection 객체의 add 메서드를 호출하면 itemAdded 이벤트가 발생하여 onItemAdded 이벤트 핸들러가 호출된다.
var collection = new Samples.Collection();
//이벤트 핸들러 등록
collection.add_itemAdded(onItemAdded);
function onItemAdded(sender, e) {
alert('Added an item to the collection');
}
//이벤트 발생시키는 메서드 호출
collection.add('test string');