diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/select.js b/packages/svelte/src/internal/client/dom/elements/bindings/select.js index 80a4c6f004..8d566f037d 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/select.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/select.js @@ -99,21 +99,13 @@ export function bind_select_value(select, get_value, update) { // @ts-ignore var value = select.__value; select_option(select, value, mounting); - if (select.multiple) { - var selected_options = [].map.call(select.querySelectorAll(':checked'), get_option_value); - update(selected_options); - } else { - /** @type {HTMLOptionElement | null} */ - var selected_option = select.querySelector(':checked'); - if (selected_option === null || get_option_value(selected_option) !== value) { - update(''); - } - } + // Deliberately don't update the binding value, + // the model should be preserved unless explicitly changed }); observer.observe(select, { childList: true, - subtree: true + subtree: true // because of }); return () => { diff --git a/packages/svelte/tests/runtime-legacy/samples/binding-select-unmatched-3/_config.js b/packages/svelte/tests/runtime-legacy/samples/binding-select-unmatched-3/_config.js index 7c73cec9a2..05b485a066 100644 --- a/packages/svelte/tests/runtime-legacy/samples/binding-select-unmatched-3/_config.js +++ b/packages/svelte/tests/runtime-legacy/samples/binding-select-unmatched-3/_config.js @@ -26,9 +26,10 @@ export default test({ assert.equal(select.value, ''); assert.equal(select.selectedIndex, -1); + // model of selected value should be kept around, even if it is not in the list assert.htmlEqual( target.innerHTML, - `

selected:

` + `

selected: a

` ); } });