Problema liste dinamiche JavaScript: array si aggiorna ma non la visualizzazione

👤 Iniziato da @reeseferrara62
📅 03/06/2025 00:10
📁 Programmazione 🌐 IT
Avatar di reeseferrara62
Ciao a tutti, sto sviluppando una web app per organizzare i miei ristoranti preferiti. Ho creato un array di oggetti con dati come nome, cucina e valutazione. Quando aggiungo nuovi elementi tramite un form, l'array si aggiorna correttamente (verificato con console.log), ma la lista a schermo non si refresha. Ecco il codice rilevante:

```javascript
const ristoranti = [];

function aggiungiRistorante() {
const nuovo = { nome: inputNome.value, cucina: selectCucina.value };
ristoranti.push(nuovo);
// Dopo push, la visualizzazione non cambia
}

function mostraLista() {
container.innerHTML = ristoranti.map(r => `<div>${r.nome} - ${r.cucina}</div>`).join('');
}
```
Ho provato a chiamare mostraLista() dopo push ma a volte funziona solo al primo inserimento. Forse è un problema di asincronia o di riferimento al DOM? Qualcuno ha suggerimenti? Grazie mille!
Avatar di spencerorlando35
Ehi @reeseferrara62, ci ho sbattuto la testa anch'io su ste cose! Il problema non è l'asincronia, ma **dove e quando** chiami `mostraLista()`. Nel codice che hai postato, non la invochi dopo il `push`! Modifica così `aggiungiRistorante`:

```javascript
function aggiungiRistorante() {
e.preventDefault(); // IMPERATIVO se usi un form, blocca il refresh della pagina!
const nuovo = { nome: inputNome.value, cucina: selectCucina.value };
ristoranti.push(nuovo);
mostraLista(); // AGGIUNGI QUI
inputNome.value = ""; // Resetta il campo, altrimenti sembra non funzionare
}
```

Poi controlla due cose **fondamentali**:
1. Hai collegato `aggiungiRistorante()` all'event listener del bottone? Es. `bottone.addEventListener('click', aggiungiRistorante)`
2. Se usi un `<form>`, **DEVI** mettere `e.preventDefault()` all'inizio della funzione, altrimenti la pagina si ricarica e perdi tutto.

Se ancora non va, posta come gestisci gli eventi. A me è successo una volta che il `container` era `null` perché avevo sbagliato l'id nell'HTML. Controlla anche quello!
Avatar di lodovicatosi35
Ciao @reeseferrara62! Ho letto il tuo problema e capisco la frustrazione. Ho avuto un'esperienza simile con un progetto di lista della spesa. Anche nel tuo caso, come ha detto giustamente @spencerorlando35, è fondamentale chiamare `mostraLista()` subito dopo il `push` per aggiornare la visualizzazione.

Un dettaglio da controllare è se il tuo `container` è correttamente selezionato nel DOM. Assicurati che l'elemento con l'id o la classe che usi per `container` esista nella tua pagina e sia accessibile quando il codice JavaScript viene eseguito. A volte, se il codice viene eseguito prima che il DOM sia completamente caricato, l'elemento potrebbe non essere ancora disponibile.

Inoltre, se stai usando un form, come suggerito da @spencerorlando35, aggiungi `e.preventDefault()` per evitare il refresh della pagina. Spero che questi consigli ti aiutino a risolvere il problema. In bocca al lupo con la tua app! 🍽️✨
Avatar di prosperomartini
@reeseferrara62, ho avuto lo stesso problema con una lista di film. Il problema è che **non stai chiamando `mostraLista()` dopo il push**. Aggiungila dentro `aggiungiRistorante()` subito dopo il push. Ecco il codice corretto:

```javascript
function aggiungiRistorante(e) {
e.preventDefault(); // Blocca il refresh della pagina
const nuovo = { nome: inputNome.value, cucina: selectCucina.value };
ristoranti.push(nuovo);
mostraLista(); // Aggiorna la visualizzazione
inputNome.value = ""; // Resetta il campo per evitare confusioni
}
```

Assicurati anche che:
1. Il `container` sia selezionato correttamente (es. `const container = document.getElementById("id")`).
2. Il codice JavaScript venga eseguito **dopo** che il DOM è caricato (metti lo script alla fine del body o usa `DOMContentLoaded`).
3. L'event listener del form sia collegato correttamente: `form.addEventListener("submit", aggiungiRistorante)`.

Se non funziona, controlla la console per errori. A me è successo che il `container` era `null` perché l'elemento non esisteva o il codice partiva prima del DOM. Prova a postare come gestisci gli eventi se ancora non va.
Avatar di leandroconti
@reeseferrara62, hai due problemi evidenti. Primo: se usi un `<form>`, **devi** bloccare il submit con `e.preventDefault()` altrimenti la pagina si ricarica e perdi tutto. Secondo: il tuo `mostraLista()` non aggiorna il DOM correttamente perché forse manca il refresh completo della lista. Prova così:

```javascript
function aggiungiRistorante(e) {
e.preventDefault(); // FONDAMENTALE
const nuovo = { nome: inputNome.value, cucina: selectCucina.value };
ristoranti.push(nuovo);
inputNome.value = ""; // Per usabilità
mostraLista();
}

function mostraLista() {
container.innerHTML = ""; // Svuota prima
ristoranti.forEach(r => {
const div = document.createElement("div");
div.textContent = `${r.nome} - ${r.cucina}`;
container.appendChild(div);
});
}
```

**Verifica anche**:
1. Che `container` sia selezionato correttamente (es. `document.getElementById("lista")`).
2. Che il codice JavaScript venga eseguito **dopo** il DOM (usa `DOMContentLoaded` o metti lo script alla fine).
3. Che l'event listener sia collegato al form: `form.addEventListener("submit", aggiungiRistorante)`.

Se non funziona, controlla la console: se `container` è `null` o hai errori di variabili non definite, è un problema di caricamento. A me è successo che... 🤦‍♂️
Avatar di reeseferrara62
Grazie mille @leandroconti! Avevo completamente sottovalutato il `e.preventDefault()` 😅 Con il tuo codice ora funziona tutto: la lista si aggiorna al volo e la pagina non si ricarica più. Ho verificato i punti:
1. Il `container` era già selezionato bene
2. Avevo lo script in fondo al body
3. L'event listener era corretto

La prossima volta che aggiungo un ristorante alla lista, offro virtualmente un aperitivo! 🍸 Ora posso finalmente catalogare quel nuovo bistrot fusion che ho scoperto.

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!