@@ -112,7 +112,7 @@ interface ViewFactory<EXPRESSION, STATEMENT> {
112112
113113 createElementEventListener ( renderer : EXPRESSION , view : EXPRESSION , boundElementIndex : number ,
114114 renderNode : EXPRESSION , eventAst : BoundEventAst ,
115- targetStatements : STATEMENT [ ] ) ;
115+ targetStatements : STATEMENT [ ] ) : EXPRESSION ;
116116
117117 setElementAttribute ( renderer : EXPRESSION , renderNode : EXPRESSION , attrName : string ,
118118 attrValue : string , targetStatements : STATEMENT [ ] ) ;
@@ -201,9 +201,11 @@ class CodeGenViewFactory implements ViewFactory<Expression, Statement> {
201201 createElementEventListener ( renderer : Expression , appView : Expression , boundElementIndex : number ,
202202 renderNode : Expression , eventAst : BoundEventAst ,
203203 targetStatements : Statement [ ] ) {
204+ var disposableVar = this . _nextDisposableVar ( ) ;
204205 var eventHandlerExpr = codeGenEventHandler ( appView , boundElementIndex , eventAst . fullName ) ;
205206 targetStatements . push ( new Statement (
206- `${ renderer . expression } .listen(${ renderNode . expression } , ${ escapeValue ( eventAst . name ) } , ${ eventHandlerExpr } );` ) ) ;
207+ `var ${ disposableVar } = ${ renderer . expression } .listen(${ renderNode . expression } , ${ escapeValue ( eventAst . name ) } , ${ eventHandlerExpr } );` ) ) ;
208+ return new Expression ( disposableVar ) ;
207209 }
208210
209211 setElementAttribute ( renderer : Expression , renderNode : Expression , attrName : string ,
@@ -345,9 +347,11 @@ class RuntimeViewFactory implements ViewFactory<any, any> {
345347 }
346348
347349 createElementEventListener ( renderer : Renderer , appView : AppView , boundElementIndex : number ,
348- renderNode : any , eventAst : BoundEventAst , targetStatements : any [ ] ) {
349- renderer . listen ( renderNode , eventAst . name , ( event ) => appView . triggerEventHandlers (
350- eventAst . fullName , event , boundElementIndex ) ) ;
350+ renderNode : any , eventAst : BoundEventAst ,
351+ targetStatements : any [ ] ) : any {
352+ return renderer . listen (
353+ renderNode , eventAst . name ,
354+ ( event ) => appView . triggerEventHandlers ( eventAst . fullName , event , boundElementIndex ) ) ;
351355 }
352356
353357 setElementAttribute ( renderer : Renderer , renderNode : any , attrName : string , attrValue : string ,
@@ -520,14 +524,16 @@ class ViewBuilderVisitor<EXPRESSION, STATEMENT> implements TemplateAstVisitor {
520524 var protoEl = this . protoView . protoElements [ elementIndex ] ;
521525
522526 protoEl . renderEvents . forEach ( ( eventAst ) => {
527+ var disposable ;
523528 if ( isPresent ( eventAst . target ) ) {
524- var disposable = this . factory . createGlobalEventListener (
529+ disposable = this . factory . createGlobalEventListener (
525530 this . renderer , this . view , protoEl . boundElementIndex , eventAst , this . renderStmts ) ;
526- this . appDisposables . push ( disposable ) ;
527531 } else {
528- this . factory . createElementEventListener ( this . renderer , this . view , protoEl . boundElementIndex ,
529- renderNode , eventAst , this . renderStmts ) ;
532+ disposable = this . factory . createElementEventListener ( this . renderer , this . view ,
533+ protoEl . boundElementIndex , renderNode ,
534+ eventAst , this . renderStmts ) ;
530535 }
536+ this . appDisposables . push ( disposable ) ;
531537 } ) ;
532538 for ( var i = 0 ; i < protoEl . attrNameAndValues . length ; i ++ ) {
533539 var attrName = protoEl . attrNameAndValues [ i ] [ 0 ] ;
0 commit comments