lock scroll bindings to allow tweening - fixes #1071

pull/1072/head
Rich Harris 7 years ago
parent 70ce51df5c
commit 297ea67ebe

@ -1,3 +1,4 @@
import CodeBuilder from '../../utils/CodeBuilder';
import deindent from '../../utils/deindent'; import deindent from '../../utils/deindent';
import { stringify } from '../../utils/stringify'; import { stringify } from '../../utils/stringify';
import flattenReference from '../../utils/flattenReference'; import flattenReference from '../../utils/flattenReference';
@ -106,6 +107,7 @@ export default class Window extends Node {
}); });
const lock = block.getUniqueName(`window_updating`); const lock = block.getUniqueName(`window_updating`);
const timeout = block.getUniqueName(`window_updating_timeout`);
Object.keys(events).forEach(event => { Object.keys(events).forEach(event => {
const handlerName = block.getUniqueName(`onwindow${event}`); const handlerName = block.getUniqueName(`onwindow${event}`);
@ -114,10 +116,14 @@ export default class Window extends Node {
if (event === 'scroll') { if (event === 'scroll') {
// TODO other bidirectional bindings... // TODO other bidirectional bindings...
block.addVariable(lock, 'false'); block.addVariable(lock, 'false');
block.addVariable(timeout,);
} }
const handlerBody = deindent` const handlerBody = deindent`
${event === 'scroll' && `${lock} = true;`} ${event === 'scroll' && deindent`
if (${lock}) return;
${lock} = true;
`}
${generator.options.dev && `component._updatingReadonlyProperty = true;`} ${generator.options.dev && `component._updatingReadonlyProperty = true;`}
#component.set({ #component.set({
@ -146,7 +152,8 @@ export default class Window extends Node {
block.builders.init.addBlock(deindent` block.builders.init.addBlock(deindent`
function ${observerCallback}() { function ${observerCallback}() {
if (${lock}) return; ${lock} = true;
clearTimeout(${timeout});
var x = ${bindings.scrollX var x = ${bindings.scrollX
? `#component.get("${bindings.scrollX}")` ? `#component.get("${bindings.scrollX}")`
: `window.scrollX`}; : `window.scrollX`};
@ -154,6 +161,7 @@ export default class Window extends Node {
? `#component.get("${bindings.scrollY}")` ? `#component.get("${bindings.scrollY}")`
: `window.scrollY`}; : `window.scrollY`};
window.scrollTo(x, y); window.scrollTo(x, y);
${timeout} = setTimeout(function() { ${lock} = false; }, 100);
} }
`); `);
@ -170,8 +178,10 @@ export default class Window extends Node {
block.builders.init.addBlock(deindent` block.builders.init.addBlock(deindent`
#component.observe("${bindings.scrollX || bindings.scrollY}", function(${isX ? 'x' : 'y'}) { #component.observe("${bindings.scrollX || bindings.scrollY}", function(${isX ? 'x' : 'y'}) {
if (${lock}) return; ${lock} = true;
clearTimeout(${timeout});
window.scrollTo(${isX ? 'x, window.scrollY' : 'window.scrollX, y'}); window.scrollTo(${isX ? 'x, window.scrollY' : 'window.scrollX, y'});
${timeout} = setTimeout(function() { ${lock} = false; }, 100);
}); });
`); `);
} }

@ -190,9 +190,10 @@ var proto = {
/* generated by Svelte vX.Y.Z */ /* generated by Svelte vX.Y.Z */
function create_main_fragment(state, component) { function create_main_fragment(state, component) {
var window_updating = false, p, text, text_1; var window_updating = false, window_updating_timeout, p, text, text_1;
function onwindowscroll(event) { function onwindowscroll(event) {
if (window_updating) return;
window_updating = true; window_updating = true;
component.set({ component.set({
@ -203,8 +204,10 @@ function create_main_fragment(state, component) {
window.addEventListener("scroll", onwindowscroll); window.addEventListener("scroll", onwindowscroll);
component.observe("y", function(y) { component.observe("y", function(y) {
if (window_updating) return; window_updating = true;
clearTimeout(window_updating_timeout);
window.scrollTo(window.scrollX, y); window.scrollTo(window.scrollX, y);
window_updating_timeout = setTimeout(function() { window_updating = false; }, 100);
}); });
return { return {

@ -2,9 +2,10 @@
import { appendNode, assign, createElement, createText, detachNode, init, insertNode, proto } from "svelte/shared.js"; import { appendNode, assign, createElement, createText, detachNode, init, insertNode, proto } from "svelte/shared.js";
function create_main_fragment(state, component) { function create_main_fragment(state, component) {
var window_updating = false, p, text, text_1; var window_updating = false, window_updating_timeout, p, text, text_1;
function onwindowscroll(event) { function onwindowscroll(event) {
if (window_updating) return;
window_updating = true; window_updating = true;
component.set({ component.set({
@ -15,8 +16,10 @@ function create_main_fragment(state, component) {
window.addEventListener("scroll", onwindowscroll); window.addEventListener("scroll", onwindowscroll);
component.observe("y", function(y) { component.observe("y", function(y) {
if (window_updating) return; window_updating = true;
clearTimeout(window_updating_timeout);
window.scrollTo(window.scrollX, y); window.scrollTo(window.scrollX, y);
window_updating_timeout = setTimeout(function() { window_updating = false; }, 100);
}); });
return { return {

Loading…
Cancel
Save