fix <svelte:window> to use new APIs

pull/1348/head
Conduitry 7 years ago
parent 1e9b32a48d
commit f2b6ec47a2

@ -172,41 +172,23 @@ export default class Window extends Node {
}); });
// special case... might need to abstract this out if we add more special cases // special case... might need to abstract this out if we add more special cases
if (bindings.scrollX && bindings.scrollY) { if (bindings.scrollX || bindings.scrollY) {
const observerCallback = block.getUniqueName(`scrollobserver`);
block.builders.init.addBlock(deindent` block.builders.init.addBlock(deindent`
function ${observerCallback}() { #component.on("state", ({ changed, current }) => {
${lock} = true; if (${
clearTimeout(${timeout}); [bindings.scrollX, bindings.scrollY].map(
var x = ${bindings.scrollX binding => binding && `changed["${binding}"]`
? `#component.get("${bindings.scrollX}")` ).filter(Boolean).join(' || ')
: `window.pageXOffset`}; }) {
var y = ${bindings.scrollY ${lock} = true;
? `#component.get("${bindings.scrollY}")` clearTimeout(${timeout});
: `window.pageYOffset`}; window.scrollTo(${
window.scrollTo(x, y); bindings.scrollX ? `current["${bindings.scrollX}"]` : `window.pageXOffset`
${timeout} = setTimeout(${clear}, 100); }, ${
} bindings.scrollY ? `current["${bindings.scrollY}"]` : `window.pageYOffset`
`); });
${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);
}); });
`); `);
} }

@ -156,11 +156,13 @@ function create_main_fragment(component, state) {
} }
window.addEventListener("scroll", onwindowscroll); window.addEventListener("scroll", onwindowscroll);
component.observe("y", function(y) { component.on("state", ({ changed, current }) => {
window_updating = true; if (changed["y"]) {
clearTimeout(window_updating_timeout); window_updating = true;
window.scrollTo(window.pageXOffset, y); clearTimeout(window_updating_timeout);
window_updating_timeout = setTimeout(clear_window_updating, 100); window.scrollTo(window.pageXOffset, current["y"]);
window_updating_timeout = setTimeout(clear_window_updating, 100);
}
}); });
return { return {

@ -15,11 +15,13 @@ function create_main_fragment(component, state) {
} }
window.addEventListener("scroll", onwindowscroll); window.addEventListener("scroll", onwindowscroll);
component.observe("y", function(y) { component.on("state", ({ changed, current }) => {
window_updating = true; if (changed["y"]) {
clearTimeout(window_updating_timeout); window_updating = true;
window.scrollTo(window.pageXOffset, y); clearTimeout(window_updating_timeout);
window_updating_timeout = setTimeout(clear_window_updating, 100); window.scrollTo(window.pageXOffset, current["y"]);
window_updating_timeout = setTimeout(clear_window_updating, 100);
}
}); });
return { return {

Loading…
Cancel
Save