@@ -17,6 +17,7 @@ import Action from './Action';
17
17
import Text from './Text' ;
18
18
import * as namespaces from '../../utils/namespaces' ;
19
19
import mapChildren from './shared/mapChildren' ;
20
+ import { dimensions } from '../../utils/patterns' ;
20
21
21
22
// source: https://gist.github.com/ArjanSchouten/0b8574a6ad7f5065a5e7
22
23
const booleanAttributes = new Set ( 'async autocomplete autofocus autoplay border challenge checked compact contenteditable controls default defer disabled formnovalidate frameborder hidden indeterminate ismap loop multiple muted nohref noresize noshade novalidate nowrap open readonly required reversed scoped scrolling seamless selected sortable spellcheck translate' . split ( ' ' ) ) ;
@@ -262,7 +263,7 @@ export default class Element extends Node {
262
263
parentNode ;
263
264
264
265
block . addVariable ( name ) ;
265
- const renderStatement = getRenderStatement ( this . compiler , this . namespace , this . name ) ;
266
+ const renderStatement = getRenderStatement ( this . namespace , this . name ) ;
266
267
block . builders . create . addLine (
267
268
`${ name } = ${ renderStatement } ;`
268
269
) ;
@@ -489,13 +490,27 @@ export default class Element extends Node {
489
490
` ) ;
490
491
491
492
group . events . forEach ( name => {
492
- block . builders . hydrate . addLine (
493
- `@addListener(${ this . var } , "${ name } ", ${ handler } );`
494
- ) ;
493
+ if ( name === 'resize' ) {
494
+ // special case
495
+ const resize_listener = block . getUniqueName ( `${ this . var } _resize_listener` ) ;
496
+ block . addVariable ( resize_listener ) ;
495
497
496
- block . builders . destroy . addLine (
497
- `@removeListener(${ this . var } , "${ name } ", ${ handler } );`
498
- ) ;
498
+ block . builders . mount . addLine (
499
+ `${ resize_listener } = @addResizeListener(${ this . var } , ${ handler } );`
500
+ ) ;
501
+
502
+ block . builders . unmount . addLine (
503
+ `${ resize_listener } .cancel();`
504
+ ) ;
505
+ } else {
506
+ block . builders . hydrate . addLine (
507
+ `@addListener(${ this . var } , "${ name } ", ${ handler } );`
508
+ ) ;
509
+
510
+ block . builders . destroy . addLine (
511
+ `@removeListener(${ this . var } , "${ name } ", ${ handler } );`
512
+ ) ;
513
+ }
499
514
} ) ;
500
515
501
516
const allInitialStateIsDefined = group . bindings
@@ -509,6 +524,14 @@ export default class Element extends Node {
509
524
`if (!(${ allInitialStateIsDefined } )) #component.root._beforecreate.push(${ handler } );`
510
525
) ;
511
526
}
527
+
528
+ if ( group . events [ 0 ] === 'resize' ) {
529
+ this . compiler . target . hasComplexBindings = true ;
530
+
531
+ block . builders . hydrate . addLine (
532
+ `#component.root._beforecreate.push(${ handler } );`
533
+ ) ;
534
+ }
512
535
} ) ;
513
536
514
537
this . initialUpdate = mungedBindings . map ( binding => binding . initialUpdate ) . filter ( Boolean ) . join ( '\n' ) ;
@@ -916,7 +939,6 @@ export default class Element extends Node {
916
939
}
917
940
918
941
function getRenderStatement (
919
- compiler : Compiler ,
920
942
namespace : string ,
921
943
name : string
922
944
) {
@@ -971,6 +993,12 @@ const events = [
971
993
node . name === 'input' && / r a d i o | c h e c k b o x | r a n g e / . test ( node . getStaticAttributeValue ( 'type' ) )
972
994
} ,
973
995
996
+ {
997
+ eventNames : [ 'resize' ] ,
998
+ filter : ( node : Element , name : string ) =>
999
+ dimensions . test ( name )
1000
+ } ,
1001
+
974
1002
// media events
975
1003
{
976
1004
eventNames : [ 'timeupdate' ] ,
0 commit comments