diff --git a/src/generators/nodes/Window.ts b/src/generators/nodes/Window.ts index 92e55025b3..38a38c1084 100644 --- a/src/generators/nodes/Window.ts +++ b/src/generators/nodes/Window.ts @@ -172,41 +172,23 @@ export default class Window extends Node { }); // special case... might need to abstract this out if we add more special cases - if (bindings.scrollX && bindings.scrollY) { - const observerCallback = block.getUniqueName(`scrollobserver`); - + if (bindings.scrollX || bindings.scrollY) { block.builders.init.addBlock(deindent` - function ${observerCallback}() { - ${lock} = true; - clearTimeout(${timeout}); - var x = ${bindings.scrollX - ? `#component.get("${bindings.scrollX}")` - : `window.pageXOffset`}; - var y = ${bindings.scrollY - ? `#component.get("${bindings.scrollY}")` - : `window.pageYOffset`}; - window.scrollTo(x, y); - ${timeout} = setTimeout(${clear}, 100); - } - `); - - if (bindings.scrollX) - block.builders.init.addLine( - `#component.observe("${bindings.scrollX}", ${observerCallback});` - ); - if (bindings.scrollY) - block.builders.init.addLine( - `#component.observe("${bindings.scrollY}", ${observerCallback});` - ); - } else if (bindings.scrollX || bindings.scrollY) { - const isX = !!bindings.scrollX; - - block.builders.init.addBlock(deindent` - #component.observe("${bindings.scrollX || bindings.scrollY}", function(${isX ? 'x' : 'y'}) { - ${lock} = true; - clearTimeout(${timeout}); - window.scrollTo(${isX ? 'x, window.pageYOffset' : 'window.pageXOffset, y'}); - ${timeout} = setTimeout(${clear}, 100); + #component.on("state", ({ changed, current }) => { + if (${ + [bindings.scrollX, bindings.scrollY].map( + binding => binding && `changed["${binding}"]` + ).filter(Boolean).join(' || ') + }) { + ${lock} = true; + clearTimeout(${timeout}); + window.scrollTo(${ + bindings.scrollX ? `current["${bindings.scrollX}"]` : `window.pageXOffset` + }, ${ + bindings.scrollY ? `current["${bindings.scrollY}"]` : `window.pageYOffset` + }); + ${timeout} = setTimeout(${clear}, 100); + } }); `); } diff --git a/test/js/samples/window-binding-scroll/expected-bundle.js b/test/js/samples/window-binding-scroll/expected-bundle.js index deb99a4bb8..df4fc6b2c9 100644 --- a/test/js/samples/window-binding-scroll/expected-bundle.js +++ b/test/js/samples/window-binding-scroll/expected-bundle.js @@ -156,11 +156,13 @@ function create_main_fragment(component, state) { } window.addEventListener("scroll", onwindowscroll); - component.observe("y", function(y) { - window_updating = true; - clearTimeout(window_updating_timeout); - window.scrollTo(window.pageXOffset, y); - window_updating_timeout = setTimeout(clear_window_updating, 100); + component.on("state", ({ changed, current }) => { + if (changed["y"]) { + window_updating = true; + clearTimeout(window_updating_timeout); + window.scrollTo(window.pageXOffset, current["y"]); + window_updating_timeout = setTimeout(clear_window_updating, 100); + } }); return { diff --git a/test/js/samples/window-binding-scroll/expected.js b/test/js/samples/window-binding-scroll/expected.js index 59009aeb9b..d18b35687e 100644 --- a/test/js/samples/window-binding-scroll/expected.js +++ b/test/js/samples/window-binding-scroll/expected.js @@ -15,11 +15,13 @@ function create_main_fragment(component, state) { } window.addEventListener("scroll", onwindowscroll); - component.observe("y", function(y) { - window_updating = true; - clearTimeout(window_updating_timeout); - window.scrollTo(window.pageXOffset, y); - window_updating_timeout = setTimeout(clear_window_updating, 100); + component.on("state", ({ changed, current }) => { + if (changed["y"]) { + window_updating = true; + clearTimeout(window_updating_timeout); + window.scrollTo(window.pageXOffset, current["y"]); + window_updating_timeout = setTimeout(clear_window_updating, 100); + } }); return {