Tenho uma variável que está corretamente vinculada ao seu pai: seu valor muda ao clicar, e esse valor é exibido corretamente tanto no pai quanto no filho vinculado. Você pode testar isso no playground svelte: https://svelte.dev/playground/c2fea05c50394c1199d31aa525df5418?version=5.19.10
+página.esbelto
<script lang='ts'>
import Foo from './Foo.svelte'
let page = $state({value:12});
$effect(() => {
console.log("Updating page: ", $inspect(page));
});
</script>
<div>
<Foo bind:page={page} />
App page is {page.value}
</div>
Foo.svelte (criança)
<script>
let {page =$bindable()} = $props();
</script>
<button onclick={()=>page.value = page.value+1}>
Value in Foo is {page.value}: click me
</button>
<br/>
Apesar da rerenderização estar acontecendo, meu $effect() que usa a mesma variável de mudança não é chamado. Como posso detectar que uma mudança aconteceu na minha página (a ideia é que eu desenvolvi um arquivo ts que salva automaticamente os dados na mudança, e não consigo encontrar uma maneira de ser notificado sobre as mudanças.
ps: salvar uma página em uma loja também precisaria que eu detectasse que uma mudança aconteceu, e como meu objeto tem dezenas de campos, não quero disparar manualmente um evento na mudança. Alguma ideia de como fazer isso?
Solução baseada na resposta de Brunnerh:
"apenas referenciar o objeto não acionará nada (a menos que ocorra uma reatribuição da variável)."
E disse, vamos tentar algo estúpido (porque, se o método não for chamado, então isso nunca deveria acontecer, certo?). Mas na verdade resolveu o problema, pois o efeito é considerado digno de ser chamado agora:
$effect(() => {
console.log("Updating page: ", $inspect(page));
autoSave.update(page = {...page})
});
Ainda é muito contraintuitivo, não acho isso explícito o suficiente. Um identificador para dizer "forçar efeito mesmo se não houver gravações acontecendo" seria melhor compreendido, eu acho