js/state.js — pub/sub ir išsaugojimas
Kodo stulpelyje — js/state.js. Pagaliau būsena turi namus: vieną modulį, kuris viską laiko ir vienintelis leidžia keisti. Aštuntos pamokos išbarstyti kintamieji susirenka čia.
Trys dalys:
- Pub/sub:
listenersaibė,subscribe(fn)(prideda ir grąžina atsisakymą),notify()(kviečia visus). Tai — visas mechanizmas. - Persistencija:
loadFavorites()skaito išlocalStoragepaleidžiant,persistFavorites()rašo po kiekvieno pakeitimo. - Veiksmai:
toggleFavoritekeičiafavorites, išsaugo ir kviečianotify(). Vienintelis būdas keisti būseną — per tokį veiksmą.
Atkreipk dėmesį į apsaugą — čia tikra „production" branda:
function loadFavorites() {
try {
const raw = localStorage.getItem(FAVORITES_KEY);
return raw ? JSON.parse(raw) : [];
} catch {
return []; // sugadintas JSON → pradedam švariai, nelūžtam
}
}
function persistFavorites() {
try {
localStorage.setItem(FAVORITES_KEY, JSON.stringify(state.favorites));
} catch (e) {
console.warn('Could not save favorites:', e); // kvota / privatus naršymas
}
}
localStorage — ne garantija. Skaitant JSON gali būti sugadintas (rankomis pakeitė, sena versija). Rašant gali baigtis kvota (~5 MB) arba privatus naršymas jį išjungia visai. Abu atvejus pagaunam: skaitydami grįžtam prie tuščio sąrašo, rašydami — tik įspėjam. Nusileisk, bet nemirk (degrade, don't die): programa veikia atmintyje, vartotojas praranda tik išsaugojimą.
Patarimas.
getState()grąžinastatetik skaitymui. Susitarimas: būseną keisti galima tik per veiksmus (kaiptoggleFavorite), kurie baigiasinotify(). Jei kur nors tiesiogiai pakeisistate.favoritesbenotify(), grįši prie 8 pamokos ligos — vaizdai neatsinaujins. Vienas įėjimo taškas keitimams — visa tvarka laikosi ant to.