2014-04-27 2 views
1

DOM 클래스의 이벤트를 수신하는보기 클래스가 있습니다. 또한 컨트롤러가 청취하는 이벤트를 발생시킵니다.클래스가 goog.events.EventHandler 및 goog.events.EventTarget이 됨

어떻게 Google Closure의 라이브러리에서 가장 잘 작동합니까?

다음은 최선의 방법입니다.

/** 
* @constructor 
* @extends {goog.events.EventHandler} 
* @implements {goog.events.Listenable} 
*/ 
var MyViewClass = function() { 
    goog.events.EventHandler.call(this); 
    goog.events.EventTarget.call(this); 
}; 
goog.inherits(MyViewClass, goog.events.EventHandler); 
goog.object.extend(MyViewClass, goog.events.EventTarget); 

더 좋은 방법이 있습니까? 내 유스 케이스는 합리적으로 보인다. 그렇지?

답변

1

비슷한 것을하는 Google Closure Library의 클래스를 발견했습니다 : goog.events.FileDropHandler.

둘 다 이벤트를 수신하고 발생시킵니다. source code의 관련 부분은 :

/** 
* @constructor 
* @extends {goog.events.EventTarget} 
*/ 
goog.events.FileDropHandler = function(element, opt_preventDropOutside) { 
    goog.events.EventTarget.call(this); 
    this.eventHandler_ = new goog.events.EventHandler(this); 
}; 
goog.inherits(goog.events.FileDropHandler, goog.events.EventTarget); 

goog.events.FileDropHandler.prototype.disposeInternal = function() { 
    goog.events.FileDropHandler.superClass_.disposeInternal.call(this); 
    this.eventHandler_.dispose(); 
}; 

따라서, goog.events.EventTarget 연장하지만 핸들러는 다른 목적으로한다. 이것은 Closure Library의 다른 클래스의 패턴을 따르는 것으로 보입니다.


은 내가 대신 disposeInternal를 오버라이드 (override)의 goog.Disposable 슈퍼 클래스에서 registerDisposable를 사용하여 선호 생각하지만, 아이디어는 동일합니다.

/** 
* @constructor 
* @extends {goog.events.EventTarget} 
*/ 
var MyViewClass = function() { 
    goog.events.EventTarget.call(this); 
    this.handler = new goog.events.EventHandler(); 
    this.registerDisposable(this.handler); 
}; 
goog.inherits(MyViewClass, goog.events.EventTarget); 
0

답변 내용은 상속보다 합성을 선호하는 것입니다. 여러 가지를 상속하는 대신 여러 가지로 구성하는 것이 좋습니다. 이것은 사물을 듣는 올바른 방법처럼 보입니다.

하지만 이미이 작업을 원한다면 goog.ui.Control을 사용해야합니다.

이벤트 처리기를 포함하고 처리기를 올바르게 처리합니다. 컨트롤은 Google 구성 요소 유형 이벤트 및 DOM 이벤트까지들을 수 있습니다.