I am attempting to get my Svelte App to react to changes to a dictionary defined in a data-store
In the following code REPL, the createNewItem function gets called when a new item is created and the user store gets updated between the ante and post displays in that function, but the getOptions function does not get called even though user.options is demonstrably changed. What is the problem?
App.svelete
<select bind:value={selectedOption}>
{#each user_options as option}
<option value={option}>{option}</option>
{/each}
</select>
<button on:click={addNewItem}>New item</button>
<NewItem />
<script>
import {user, state, elementDisplay } from './data'
import NewItem from "./NewItem.svelte";
$: user_options = getOptions($user.options);
$: new_item = createNewItem($state.new_item);
let selectedOption = "";
function getOptions(user_options) {
console.log('user changed')
let options = []
if (state.new_item != '') {
user_options[$user.new_item] = ''
}
for (const [option, value] of Object.entries(user_options)) {
options.push(option)
}
return options
}
function createNewItem(new_item) {
if (new_item.length > 0 ) {
console.log('ante', $user)
$user.options[new_item] = '';
console.log('post', $user)
}
}
function addNewItem() {
elementDisplay('new-item', 'block')
document.getElementById('new-item-value').focus();
}
</script>
NewItem.svelte
<div id="new-item">
<input type="text" id="new-item-value">
<div class="buttons">
<button class="select-button" on:click={useItem}>Use</button>
<button class="select-button" on:click={close}>Close</button>
</div>
</div>
<style>
#new-item {
display: none;
}
</style>
<script>
import { state, elementDisplay } from './data'
function useItem() {
let input_field = document.getElementById('new-item-value')
if (input_field.value) {
$state.new_item = input_field.value
}
close()
}
function close() {
elementDisplay('new-item', 'none');
}
</script>
data.js
import { writable } from 'svelte/store';
export let user = writable({
new_item: '',
options: {
"2": "Option 2",
"1": "Option 1",
"3": "Option 3",
}
}
);
export let state = writable({
new_item: '',
});
export function elementDisplay(item_name, display) {
let item = document.getElementById(item_name);
item.style.display = display;
};