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.