Modyfikujemy pozostałe funkcje, aby aktualizowały localStorage
Aby dokończyć wersję 2.0 aplikacji, pozostało nam tylko dodać funkcję updateTasksInLocalStorage() do pozostałych funkcji (po prostu kopiuj i wklejaj updateTasksInLocalStorage(); we właściwych miejscach w funkcjach, czyli po modyfikacji zmiennej tasks):
// todo-app-local-storage app code:
// ...tutaj jest poprzedni kod w pliku
function addTaskAtIndex(index, newTask) {
tasks.splice(index, 0, newTask);
console.log("Do Twoich zadań zostało dodane nowe zadanie:", newTask);
updateTasksInLocalStorage(); // <= dodajemy updateTasksInLocalStorage()
showTasks();
}
function deleteTask(index) {
tasks.splice(index, 1);
updateTasksInLocalStorage(); // <= dodajemy updateTasksInLocalStorage()
showTasks();
}
function deleteAllTasks() {
tasks = [];
console.log("Wszystkie zadania zostały usunięte...");
updateTasksInLocalStorage(tasks); // <= dodajemy updateTasksInLocalStorage()
showTasks();
}
// odpalając program, wyświetlamy zapisane zadania na start:
showTasks();
Jeszcze raz (na wszelki wypadek) wytłumaczę, dlaczego dodaliśmy funkcję updateTasksInLocalStorage() i dlaczego dodaliśmy ją w określonym miejscu w naszym kodzie.
Wspomniana funkcja ma dostęp do globalnej zmiennej tasks. Zmienna ta nazywa się globalną, ponieważ została zadeklarowana poza żadną funkcją, w związku z czym nic nie ogranicza jej zasięgu - mamy do niej dostęp w dowolnej linijce kodu poniżej jej deklaracji. updateTasksInLocalStorage() nie robi nic innego, jak przypisuje do klucza "tasks", znajdującego się w localStorage, aktualną wartość zmiennej tasks, czyli jej rzeczywistą wartość w chwili zapisu.
Jeśli np. dodaliśmy coś do tablicy tasks, a potem wywołamy updateTasksInLocalStorage(), to będzie miała ona dostęp do zmienionej przed sekundą tablicy zadań. Dlatego tak ważne jest, by wywołać updateTasksInLocalStorage() dopiero po aktualizacji zadań, a nie np. przed, ponieważ w tym przypadku zapisalibyśmy wartość tasks przed zmianą jej wartości.
Zobaczmy przykład ✅ poprawnej aktualizacji localStorage:
// przykładowa lista zadań:
let tasks = ["a", "b", "c"];
console.log(tasks); // => ["a", "b", "c"]
// 1. najpierw dodajemy zadanie do zmiennej:
tasks.push("d");
console.log(tasks); // => ["a", "b", "c", "d"]
// 2. dopiero teraz aktualizujemy localStorage,
// czyli wrzucamy do niego taski z nowododanym "d":
updateTasksInLocalStorage(); // zapisaliśmy ["a", "b", "c", "d"] do localStorage
W tym przykładzie zachowaliśmy spójny stan aplikacji: zmienna task jest "zsynchronizowana" z wartością "tasks" w localStorage.
Poniżej z kolei jest przykład ❌ niepoprawnej aktualizacji localStorage:
// przykładowa lista zadań:
let tasks = ["a", "b", "c"];
console.log(tasks); // => ["a", "b", "c"]
// 1. najpierw aktualizujemy localStorage:
updateTasksInLocalStorage(); // w localStorage zapisujemy aktualną wartość tasków => ["a", "b", "c"]
// 2. dodajemy zadanie do zmiennej:
tasks.push("d");
console.log(tasks); // => ["a", "b", "c", "d"]
Jak widzisz, "rozjechał" nam się stan aplikacji: localStorage przechowuje wartość tasks sprzed dodania nowego zadania do listy, w związku z czym localStorage i tasks nie są zsynchronizowane.
Pamiętaj zatem, żeby pilnować:
- kolejności poleceń w JavaScript - kod jest wykonywany od góry do dołu;
- pilnuj stanu aplikacji, jeśli zmienne/ lokalizacje wymieniają się danymi.