From aa3bd9944a98efa323878b6bf35ec1356f302915 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 20 Mar 2024 09:32:39 +0000 Subject: [PATCH] follow up to 10846 --- .changeset/smart-turkeys-tell.md | 2 +- .../client/dom/elements/bindings/select.js | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.changeset/smart-turkeys-tell.md b/.changeset/smart-turkeys-tell.md index b4598ca14b..e864cd19df 100644 --- a/.changeset/smart-turkeys-tell.md +++ b/.changeset/smart-turkeys-tell.md @@ -2,4 +2,4 @@ "svelte": patch --- -fix: ensure select value is updated upon select element removal +fix: ensure select value is updated upon select option removal 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 8c0f535cd1..b04d7b6660 100644 --- a/packages/svelte/src/internal/client/dom/elements/bindings/select.js +++ b/packages/svelte/src/internal/client/dom/elements/bindings/select.js @@ -1,4 +1,5 @@ import { effect } from '../../../reactivity/effects.js'; +import { is_array } from '../../../utils.js'; /** * Selects the correct option(s) (depending on whether this is a multiple select) @@ -98,15 +99,23 @@ export function bind_select_value(select, get_value, update) { // @ts-ignore var value = select.__value; select_option(select, value, mounting); - /** @type {HTMLOptionElement | null} */ - var selected_option = select.querySelector(':checked'); - if (selected_option === null || get_option_value(selected_option) !== value) { - update(''); + if (select.multiple) { + var selected_options = [].map.call(select.querySelectorAll(':checked'), get_option_value); + if (is_array(value) && selected_options.every(e => value.includes)) { + update(selected_options) + } + } else { + /** @type {HTMLOptionElement | null} */ + var selected_option = select.querySelector(':checked'); + if (selected_option === null || get_option_value(selected_option) !== value) { + update(''); + } } }); observer.observe(select, { - childList: true + childList: true, + subtree: true }); return () => {