Хорошо, примерно получите то, что вы пытаетесь описать здесь.
На самом деле вы можете использовать реактивное объявление для выполнения кода при изменении переменной / хранилища.
В этом случае необходимо выполнить метод повторной подписки:
let normDocRef = null;
let normData = null;
let normSubscription = null;
$: {
normDocRef = db.doc(`uploads/${$session.a_id}_${$session.year}`);
// renew the subscription if $session changes
if (normSubscription) {
normSubscription.unsubscribe();
normSubscription = doc(normDocRef).subscribe(snapshot => {
if (snapshot.exists) {
normData = snapshot.data();
} else {
normData = null;
};
});
}
}
onDestroy(() => {
if (normSubscription) normSubscription.unsubscribe();
});
Ключевым моментом здесь является то, что при компиляции Svelte знает, что блок зависит от $session
, поэтому он повторно выполнит блок кода. всякий раз, когда $session
изменяется.
Если вы хотите преобразовать его в другую функцию, вам нужно убедиться, что Svelte знает, что функция зависит от $session
, то есть:
$: resubscribe_norm($session);
Здесь Svelte может сказать, что, если $session
изменилось, нужно снова вызвать resubscribe_norm
.