Passaggio di valori fra funzioni

di il
40 risposte

40 Risposte - Pagina 3

  • Re: Passaggio di valori fra funzioni

    Ciao. Dopo che mi è venuto il mal di testa e lavorato sopra per due giorni finalmente funziona. Uso una funzione per inserire i dati e una funzione per recuperarli:

    var dbGuardia=[];
    var guardia={};
    
     function insGuardia(){
      
      let nome =document.getElementById("nom").value;
       let cognome=document.getElementById("cogn").value;
      let indi=document.getElementById("ind").value;
     let telefono=document.getElementById("tel").value;
    let guardia={'nome':nome,'cognome':cognome,'indirizzo':indi,'telefono':telefono};
       
       
      dbGuardia.push(guardia);
    
      localStorage.setItem('guardie',JSON.stringify(dbGuardia));
     // document.getElementById("vis1").innerHTML =localStorage.getItem('guardie')+"<br>";
      document.getElementById('vis1').innerHTML=localStorage.getItem('guardie') + "<br>";
      
    }
    
    
    function recupera(){
     let nomMod=document.getElementById('idx').value;
      let y=JSON.parse(localStorage.getItem('guardie'));
    
      //document.getElementById('mod').innerHTML=JSON.stringify(y[1].nome);
    for(let i=0; i <= y.length; i++){
       if(nomMod==y[i].nome){
    
          
          document.getElementById('mod').innerHTML="Nominativo  trovato"+"<br>" + y[i].nome+ " "+
          y[i].cognome+" "+ y[i].indirizzo+" "+y[i].telefono;
          
          document.getElementById('modNom').value=y[i].nome ;
          document.getElementById('modCogn').value=y[i].cognome;
          document.getElementById('modInd').value=y[i].indirizzo;
          document.getElementById('modTel').value=y[i].telefono;
       break;
    }else{
    
          document.getElementById('modNom').value ="";
          document.getElementById('modCogn').value="";
          document.getElementById('modInd').value="";
          document.getElementById('modTel').value="";
          
          document.getElementById('mod').innerHTML="Nominativo non trovato";
          
        } 
      }
     }
     
     
     
    
     
    
    
     
    
    
    
    
    

    Ora mi complico un pò di più la vita. Una volta recuperato il valore di una singola guardia( e ce n'è voluto!) vorrei avere la possibilità di modificare una singola proprietà. Ad esempio vorrei cambiare ad esempio l'indirizzo di una singola guardia. Mal di testa assicurato :).

    Ho provato a fare qualcosa ma mi sovrascrive tutto l'array. Devo lavorarci sopra. Comunque grazie infinite.

  • Re: Passaggio di valori fra funzioni

    02/02/2023 - tonyven1 ha scritto:


    Una volta recuperato il valore di una singola guardia( e ce n'è voluto!) vorrei avere la possibilità di modificare una singola proprietà. Ad esempio vorrei cambiare ad esempio l'indirizzo di una singola guardia.

    Basta salvare il valore desiderato nella proprietà dell'oggetto che rappresenta la specifica guardia e che si trova all'interno dell'array.

    02/02/2023 - tonyven1 ha scritto:


    Ho provato a fare qualcosa ma mi sovrascrive tutto l'array.

    Non è chiaro cosa intendi, ma che ogni volta l'array venga letto e/o sovrascritto completamente nelle fasi di caricamento e salvataggio, è del tutto normale: nel Local Storage si va sempre a mettere l'array con i dati aggiornati, e come tale lo si va a rileggere.

    Se modifichi le proprietà di una guardia e poi salvi l'array delle guardie nel Local Storage, troverai al suo interno l'array degli stessi oggetti ma la proprietà dovrebbe essere comunque modificata così come ci si aspetta.

  • Re: Passaggio di valori fra funzioni

    Ciao.Grazie mille ho risolto. Piano piano funziona tutto. Ora riesco a inserire i dati di ogni singola guardia. Poi se voglio modificare il nome o altro di una singola guardia riesco a farlo. Cercando di perfezionare la cosa ho notato che quando inserisco una guardia nello storage la chiave rimane sempre la stessa mentre le proprietà vengono aggiunte. Spero di essermi spiegato. Ora sto provando a implementare il metodo removeItem() dello storage. E qui si è presentato un altro problema. Il metodo removeItem accetta come argomento la chiave. E io ne ho solo una con diverse proprietà che corrispondono alle singole guardie che inserisco. Se voglio quindi eliminare una singola guardia devo trovare il modo di inserire una chiave e una proprietà per ogni singola guardia. Quindi debbo rivedere il metodo insGuardia e fare in modo che ogni volta che inserisco una guardia ci sia una "key" e una proprietà. Qualche consiglio?

    function insGuardia(){
      
      
      let nome =document.getElementById("nom").value;
       let cognome=document.getElementById("cogn").value;
      let indi=document.getElementById("ind").value;
     let telefono=document.getElementById("tel").value;
     guardia={'nome':nome,'cognome':cognome,'indirizzo':indi,'telefono':telefono};
       
       
    dbGuardia.push(guardia);
    
      localStorage.setItem('guardie',JSON.stringify(dbGuardia));
    
      document.getElementById('vis1').innerHTML=JSON.stringify(localStorage.getItem('guardie')) + "<br>";
      
    }
  • Re: Passaggio di valori fra funzioni

    04/02/2023 - tonyven1 ha scritto:


    Quindi debbo rivedere il metodo insGuardia e fare in modo che ogni volta che inserisco una guardia ci sia una "key" e una proprietà.

    Aggiungi a ogni guarda una proprietà id di tipo “numerico intero” e salvaci un valore autoincrementale.

    Io comunque non vedo la necessità: la posizione della guardia nell'array - ovvero il suo indice - può essere benissimo la chiave da utilizzare.

    La chiave che occorre a identificare una specifica guardia e quella indicata per salvare i dati sul Local Storage sono due cose separate che non c'entrano l'una con l'altra.

  • Re: Passaggio di valori fra funzioni

    Ciao. Infatti hai ragione. Sono due cose diverse. Mi sono incartato. Quando inserisco le guardie va tutto bene. Quando ne cancello una ,va bene. Ma quando vado nuovamente a inserire una guardia mi sovrascrive tutto. Ho provato a lavorare sull'indice dell'array ma quando vado a cancellare mi svuota tutto l'array. Premetto che prima cancello una guardia qualsiasi poi ho provato sia con slice() sia che con push() sull'array ma non va. Comunque posto il codice finora fatto:

    var dbGuardia=[];
    var guardia={};
    
    
     function insGuardia(){
      
      
      let nome =document.getElementById("nom").value;
       let cognome=document.getElementById("cogn").value;
      let indi=document.getElementById("ind").value;
     let telefono=document.getElementById("tel").value;
     guardia={'nome':nome,'cognome':cognome,'indirizzo':indi,'telefono':telefono};
       
       
      dbGuardia.push(guardia);
      
    
      localStorage.setItem('guardie',JSON.stringify(dbGuardia));
     
     // document.getElementById("vis1").innerHTML =localStorage.getItem('guardie')+"<br>";
      document.getElementById('vis1').innerHTML=JSON.stringify(localStorage.getItem('guardie')) + "<br>";
      
    }
    
    function cancella(){
        let nomMod=document.getElementById('idx').value;
        let x=JSON.parse(localStorage.getItem('guardie'));
       for(let i=0; i < x.length; i++){
        if(nomMod ==x[i].cognome){
        x.splice(i,1);
       localStorage.setItem('guardie',JSON.stringify(x));
          document.getElementById('mod').innerHTML=JSON.stringify(x);
         break;
       }else{
        document.getElementById('mod').innerHTML="Nominativo non rimosso";
       }
      
      }
     
    }

    Oltretutto la cosa che mi pare strana è che quando faccio il push() dell'array modificato ,questo diventa un array di array e non dovrebbe essere.

  • Re: Passaggio di valori fra funzioni

    06/02/2023 - tonyven1 ha scritto:


    Comunque posto il codice finora fatto […]

    Il codice è pressoché illeggibile, quindi non mi metto a debuggarlo tutto.

    Per dire, vedo che ci sono chiamate al Local Storage ovunque, con JSON.stringify() invocato milioni di volte quando dovrebbe servire una volta sola, ossia quando si salvano i dati delle guardie.

    In generale, mi aspetterei che ci fosse una singola funzione per

    1. inserire una guardia nell'array
    2. modificarne una qualsiasi
    3. cancellarne una qualsiasi
    4. caricare i dati dallo storage precedentemente salvati, se disponibili,
    5. salvare i dati, se è presente almeno una guardia.

    Dividi le operazioni in singole operazioni, e dividi correttamente le parti che svolgono una logica da quelli che interagiscono con la pagina per esigenze di visualizzazione e/o acquisizione dati dalla pagina.

  • Re: Passaggio di valori fra funzioni

    Ciao. Non capisco perchè dici che il codice è illegibile. Sono due funzioni una inserisce e l'altra cancella. Il mio problema a questo punto è il metodo perchè ogni volta che metto mano allo storage sovrascrive tutto. Ho fatto esattamente come dici te e se può essere utile posso postare con codepen(non so se si può fare) tutta l'applicazione che ho fatto. Ho scritto una funzione per ogni operazione. Comunque c'è qualcosa che non va con la mia macchina perchè ogni volta che chiudo e riapro il browser (chrome) lo storage si svuota. Molto probabilmente non so usarlo a dovere.

  • Re: Passaggio di valori fra funzioni

    07/02/2023 - tonyven1 ha scritto:


    Non capisco perchè dici che il codice è illegibile.

    Anche quando formattato gli spazi sono tutti disordinati, ci sono variabili all'esterno delle funzioni usate poi al loro interno, un miscuglio di var e di let, codice che implementa della logica inframezzato da codice che accede al DOM per visualizzazione, JSON.parse() e JSON.stringify() ripetuti più volte quando non serve, una funzione lavora sulla variabile “dbGuardie” mentre l'altra funzione si crea una variabile per conto proprio, uso di nomi per le variabili poco significative, continue assegnazioni a innerHTML di dati JSON (a che serve mai??), …

    07/02/2023 - tonyven1 ha scritto:


    Ho fatto esattamente come dici te […]

    Non direi.

    07/02/2023 - tonyven1 ha scritto:


    Comunque c'è qualcosa che non va con la mia macchina […]

    Il bello di JavaScript e degli standard Web in generale è uno solo: funzionano allo stesso modo su qualsiasi sistema operativo, su qualsiasi browser e su qualsiasi device.

    Se c'è qualcosa che non va con la tua macchina, c'è qualcosa che non va nel codice e quella cosa non andrà su qualsiasi macchina.

  • Re: Passaggio di valori fra funzioni

    Ciao. Ho cercato di capire perchè lo storage non funzionava. Nel senso che cosi come avevo scritto il codice riuscivo a inserire dati nello storage, però quando chiudo e riapro il browser si perdeva il tutto. Ora ho visto che usando localStorage.setItem() fuori dalla funzione di inserimento funziona come dovrebbe. Almeno mi sembra cosi. Ora sono in un vicolo cieco perchè usando sempre la funzione setItem() con l'array dbGuardia ovviamente risulta vuoto perchè non definito. Infatti è definito dentro la funzione insGuardia. Qui mi rendo conto che ho delle difficoltà a rendere l'array disponibile fuori dalla funzione. Come posso fare? Ho provato in diversi modi ma mi sfugge qualcosa.

    insGuardia();
    
    
    localStorage.setItem('guardie',JSON.stringify(dbGuardia));
    
     function insGuardia(){
    let dbGuardia=[];
    let guardia={};
      let nome =document.getElementById("nom").value;
       let cognome=document.getElementById("cogn").value;
      let indi=document.getElementById("ind").value;
     let telefono=document.getElementById("tel").value;
     guardia={'nome':nome,'cognome':cognome,'indirizzo':indi,'telefono':telefono};
       
       
      dbGuardia.push(guardia);
      document.getElementById('vis1').innerHTML=JSON.stringify(localStorage.getItem('guardie')) + "<br>";
      return dbGuardia;
    }
    
  • Re: Passaggio di valori fra funzioni

    Ciao. Ho modificato la funzione insGuardia() e nello storage inserisco più chiavi e ogni chiave ha un valore. Ora sto provando a implementare una funzione recupera() dove inserendo il nome della guardia mi dovrebbe tirare fuori i dati della guardia. Non riesco però a tirare fuori il nome della singola guardia che sto cercando. Li tira fuori tutti:

    function insGuardia() {
      var dbGuardia = [];
      var guardia = {};
    
    
      let nome = document.getElementById("nom").value;
      let cognome = document.getElementById("cogn").value;
      let indi = document.getElementById("ind").value;
      let telefono = document.getElementById("tel").value;
    
      guardia = { 'nome': nome, 'cognome': cognome, 'indirizzo': indi, 'telefono': telefono };
    
    
    
      dbGuardia.push(guardia);
      localStorage.setItem(JSON.stringify(guardie), JSON.stringify(dbGuardia));
      for (let key in localStorage) {
        if (!localStorage.hasOwnProperty(key)) {
          continue; // salta keys come "setItem", "getItem" etc
        }
        document.getElementById('vis1').innerHTML = JSON.stringify(localStorage.getItem(key));
      }
      
      guardie++;
      return dbGuardia;
    }
    
    function recupera() {
     
      let nomMod = document.getElementById('idx').value;
      for (let key in localStorage) {
        if (!localStorage.hasOwnProperty(key)) {
          continue; // salta keys come "setItem", "getItem" etc
        }
       
        
        for(let i=0; i < key.length; i++){
          let y=localStorage.getItem(key);
        let z=JSON.parse(y);
       
          let a=JSON.stringify(z[i].nome)
          document.getElementById('mod').innerHTML +=a;// serve a vedere cosa c'è dentro a
          if( nomMod == a){
            document.getElementById('mod').innerHTML +=JSON.stringify(z[i].nome);
            
          }else{
            document.getElementById('mod').innerHTML ='NO';
          }
          
        }
        
      }
    } 

    L'istruzione che mi fa rompere la testa è l'if che ho messo. Se il nome che inserisco in una text box corrisponde a un nome delle guardie che ho inserito mi dovrebbe stampare a video( come test) il nome della guardia cercata. Invece salta sempre all'else. Non riesco a estrapolare il singolo nome che mi interessa. Dove sbaglio?

  • Re: Passaggio di valori fra funzioni

    Come detto in qualche risposta precedente, debuggare questo codice è un lavoro immane, tra poca leggibilità causa allineamenti sbagliati, nomi di variabili poco significativi (dbGuardie, guardia, guardie, x, y, z, …) e quando si raggiunge un minimo di risultato, il codice viene di nuovo stravolto, non nella logica bensì nell'architettura (il salvataggio e caricamento su Local Storage di tutte le guardie andava bene, perché cambiarlo?), tuttavia i difetti più grossi e quelli segnalati più volte non vengono mai risolti, e si riparte sempre da zero scrutando un codice nel tentativo di capire quello che fa, e dove la soluzione sarebbe quella di fornire una implementazione finale funzionante (visto che molti suggerimenti vengono puntualmente disattesi).

    Per capire cosa non va basterebbe debuggare il codice e vedere i valori che assumono le variabili di volta in volta, e questo sarebbe sufficiente a capire come mai entra - o non entra in un if(), perché un ciclo si ripete, cosa viene caricato, cosa viene salvato.

    Il codice è costellato di “stampe di prova” che ne limitano estremamente la leggibilità e impediscono di capire cosa fa, complice anche i nomi poco significativi delle variabili come predetto, con una mescolanza peraltro di valori interi, pezzi di HTML, e tante altre informazioni che risultano mancanti oppure omesse (ad esempio, dov'è la dichiarazione di “guardie”?).

    Io alzo le mani, perché siamo alla ennesima pagina di discussione sullo stesso problema e si continua a ripetere gli stessi errori, o a introdurne di nuovi laddove (finalmente) il codice stava funzionando (anche se parzialmente), quindi non vedo una via di uscita o comunque non vedo l'investimento di tempo proficuo per aiutare, perché non c'è un metodo rigoroso e puntuale nella verifica delle problematiche e nella loro risoluzione, ma un procedere continuo a tentoni che talvolta smonta pure quel poco di buono che viene fatto.

    Sorry… 

Devi accedere o registrarti per scrivere nel forum
40 risposte