From fb30ed079e2add84883d4224797b5f228573633a Mon Sep 17 00:00:00 2001 From: AlbertLucianto Date: Tue, 5 Nov 2019 00:48:16 +0800 Subject: [PATCH 1/2] fix input binding fails if type declared last --- src/compiler/compile/nodes/Element.ts | 10 +++ .../bindings-readonly-order/expected.js | 82 +++++++++++++++++++ .../bindings-readonly-order/input.svelte | 6 ++ 3 files changed, 98 insertions(+) create mode 100644 test/js/samples/bindings-readonly-order/expected.js create mode 100644 test/js/samples/bindings-readonly-order/input.svelte diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts index d353d20158bb..82dfd3a4c4e7 100644 --- a/src/compiler/compile/nodes/Element.ts +++ b/src/compiler/compile/nodes/Element.ts @@ -151,6 +151,16 @@ export default class Element extends Node { } } + // Binding relies on Attribute, defer its evaluation + const deferreds = ['Binding']; + + info.attributes.sort((node1, node2) => { + const deferIndex1 = deferreds.indexOf(node1.type); + const deferIndex2 = deferreds.indexOf(node2.type); + + return deferIndex1 - deferIndex2; + }); + info.attributes.forEach(node => { switch (node.type) { case 'Action': diff --git a/test/js/samples/bindings-readonly-order/expected.js b/test/js/samples/bindings-readonly-order/expected.js new file mode 100644 index 000000000000..b7e004ec2368 --- /dev/null +++ b/test/js/samples/bindings-readonly-order/expected.js @@ -0,0 +1,82 @@ +import { + SvelteComponent, + attr, + detach, + element, + init, + insert, + listen, + noop, + run_all, + safe_not_equal, + space +} from "svelte/internal"; + +function create_fragment(ctx) { + let input0; + let t; + let input1; + let dispose; + + return { + c() { + input0 = element("input"); + t = space(); + input1 = element("input"); + attr(input0, "type", "file"); + attr(input1, "type", "file"); + + dispose = [ + listen(input0, "change", ctx.input0_change_handler), + listen(input1, "change", ctx.input1_change_handler) + ]; + }, + m(target, anchor) { + insert(target, input0, anchor); + insert(target, t, anchor); + insert(target, input1, anchor); + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(input0); + if (detaching) detach(t); + if (detaching) detach(input1); + run_all(dispose); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let { files } = $$props; + + function input0_change_handler() { + files = this.files; + $$invalidate("files", files); + } + + function input1_change_handler() { + files = this.files; + $$invalidate("files", files); + } + + $$self.$set = $$props => { + if ("files" in $$props) $$invalidate("files", files = $$props.files); + }; + + return { + files, + input0_change_handler, + input1_change_handler + }; +} + +class Component extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { files: 0 }); + } +} + +export default Component; \ No newline at end of file diff --git a/test/js/samples/bindings-readonly-order/input.svelte b/test/js/samples/bindings-readonly-order/input.svelte new file mode 100644 index 000000000000..9a133b90f2f6 --- /dev/null +++ b/test/js/samples/bindings-readonly-order/input.svelte @@ -0,0 +1,6 @@ + + + + From 15cc6f729a071f6287e223f86e59ca1f829c9098 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 6 Nov 2019 07:03:32 -0500 Subject: [PATCH 2/2] compactify code --- src/compiler/compile/nodes/Element.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts index 82dfd3a4c4e7..555c772f232a 100644 --- a/src/compiler/compile/nodes/Element.ts +++ b/src/compiler/compile/nodes/Element.ts @@ -152,14 +152,8 @@ export default class Element extends Node { } // Binding relies on Attribute, defer its evaluation - const deferreds = ['Binding']; - - info.attributes.sort((node1, node2) => { - const deferIndex1 = deferreds.indexOf(node1.type); - const deferIndex2 = deferreds.indexOf(node2.type); - - return deferIndex1 - deferIndex2; - }); + const order = ['Binding']; // everything else is -1 + info.attributes.sort((a, b) => order.indexOf(a.type) - order.indexOf(b.type)); info.attributes.forEach(node => { switch (node.type) {