Tema
/
Interneto svetainių kliento dalies kūrimas JS

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: listeners aibė, subscribe(fn) (prideda ir grąžina atsisakymą), notify() (kviečia visus). Tai — visas mechanizmas.
  • Persistencija: loadFavorites() skaito iš localStorage paleidžiant, persistFavorites() rašo po kiekvieno pakeitimo.
  • Veiksmai: toggleFavorite keičia favorites, išsaugo ir kviečia notify(). 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ąžina state tik skaitymui. Susitarimas: būseną keisti galima tik per veiksmus (kaip toggleFavorite), kurie baigiasi notify(). Jei kur nors tiesiogiai pakeisi state.favorites be notify(), grįši prie 8 pamokos ligos — vaizdai neatsinaujins. Vienas įėjimo taškas keitimams — visa tvarka laikosi ant to.