@@ -16,6 +16,7 @@ import {Content} from './shadow_dom_emulation/content_tag';
1616import { LightDom , DestinationLightDom } from './shadow_dom_emulation/light_dom' ;
1717import { ShadowDomStrategy } from './shadow_dom_strategy' ;
1818import { ViewPool } from './view_pool' ;
19+ import { EventManager } from 'angular2/src/core/events/event_manager' ;
1920
2021const NG_BINDING_CLASS = 'ng-binding' ;
2122const NG_BINDING_CLASS_SELECTOR = '.ng-binding' ;
@@ -294,19 +295,19 @@ export class ProtoView {
294295 }
295296
296297 // TODO(rado): hostElementInjector should be moved to hydrate phase.
297- instantiate ( hostElementInjector : ElementInjector ) :View {
298- if ( this . _viewPool . length ( ) == 0 ) this . _preFillPool ( hostElementInjector ) ;
298+ instantiate ( hostElementInjector : ElementInjector , eventManager : EventManager ) :View {
299+ if ( this . _viewPool . length ( ) == 0 ) this . _preFillPool ( hostElementInjector , eventManager ) ;
299300 var view = this . _viewPool . pop ( ) ;
300- return isPresent ( view ) ? view : this . _instantiate ( hostElementInjector ) ;
301+ return isPresent ( view ) ? view : this . _instantiate ( hostElementInjector , eventManager ) ;
301302 }
302303
303- _preFillPool ( hostElementInjector : ElementInjector ) {
304+ _preFillPool ( hostElementInjector : ElementInjector , eventManager : EventManager ) {
304305 for ( var i = 0 ; i < VIEW_POOL_PREFILL ; i ++ ) {
305- this . _viewPool . push ( this . _instantiate ( hostElementInjector ) ) ;
306+ this . _viewPool . push ( this . _instantiate ( hostElementInjector , eventManager ) ) ;
306307 }
307308 }
308309
309- _instantiate ( hostElementInjector : ElementInjector ) : View {
310+ _instantiate ( hostElementInjector : ElementInjector , eventManager : EventManager ) : View {
310311 var rootElementClone = this . instantiateInPlace ? this . element : DOM . clone ( this . element ) ;
311312 var elementsWithBindingsDynamic ;
312313 if ( this . isTemplateElement ) {
@@ -387,7 +388,7 @@ export class ProtoView {
387388 var bindingPropagationConfig = null ;
388389 if ( isPresent ( binder . componentDirective ) ) {
389390 var strategy = this . shadowDomStrategy ;
390- var childView = binder . nestedProtoView . instantiate ( elementInjector ) ;
391+ var childView = binder . nestedProtoView . instantiate ( elementInjector , eventManager ) ;
391392 view . changeDetector . addChild ( childView . changeDetector ) ;
392393
393394 lightDom = strategy . constructLightDom ( view , childView , element ) ;
@@ -402,7 +403,8 @@ export class ProtoView {
402403 var viewPort = null ;
403404 if ( isPresent ( binder . templateDirective ) ) {
404405 var destLightDom = this . _directParentElementLightDom ( protoElementInjector , preBuiltObjects ) ;
405- viewPort = new ViewPort ( view , element , binder . nestedProtoView , elementInjector , destLightDom ) ;
406+ viewPort = new ViewPort ( view , element , binder . nestedProtoView , elementInjector ,
407+ eventManager , destLightDom ) ;
406408 ListWrapper . push ( viewPorts , viewPort ) ;
407409 }
408410
@@ -416,7 +418,8 @@ export class ProtoView {
416418 if ( isPresent ( binder . events ) ) {
417419 MapWrapper . forEach ( binder . events , ( expr , eventName ) => {
418420 if ( isBlank ( elementInjector ) || ! elementInjector . hasEventEmitter ( eventName ) ) {
419- ProtoView . _addNativeEventListener ( element , eventName , expr , view ) ;
421+ var handler = ProtoView . buildInnerCallback ( expr , view ) ;
422+ eventManager . addEventListener ( element , eventName , handler ) ;
420423 }
421424 } ) ;
422425 }
@@ -432,24 +435,15 @@ export class ProtoView {
432435 this . _viewPool . push ( view ) ;
433436 }
434437
435- static _addNativeEventListener ( element : Element , eventName : string , expr : AST , view : View ) {
438+ static buildInnerCallback ( expr :AST , view :View ) {
436439 var locals = MapWrapper . create ( ) ;
437- var innerCallback = ProtoView . buildInnerCallback ( expr , view , locals ) ;
438- DOM . on ( element , eventName , ( event ) => {
439- if ( event . target === element ) {
440- innerCallback ( event ) ;
441- }
442- } ) ;
443- }
444-
445- static buildInnerCallback ( expr :AST , view :View , locals : Map ) {
446440 return ( event ) => {
447441 // Most of the time the event will be fired only when the view is
448442 // in the live document. However, in a rare circumstance the
449443 // view might get dehydrated, in between the event queuing up and
450444 // firing.
451445 if ( view . hydrated ( ) ) {
452- MapWrapper . set ( locals , ` $event` , event ) ;
446+ MapWrapper . set ( locals , ' $event' , event ) ;
453447 var context = new ContextWithVariableBindings ( view . context , locals ) ;
454448 expr . eval ( context ) ;
455449 }
0 commit comments