[JS]Un metodo non viene riconosciuto dentro una funzione

Discussioni su qualunque linguaggio di programmazione o engine
Rispondi
Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

[JS]Un metodo non viene riconosciuto dentro una funzione

Messaggio da Cash »

Sto provando a fare una web app per segnare i voti scolastici, per organizzare il tutto ho voluto provare a creare degli oggetti. Adesso ho gli oggetti 'Voto', 'Materia' e 'Registro'. Ogni oggetto 'Registro' ha dentro se un array di oggetti 'Materia' e ogni oggetto 'Materia' ha dentro di se un array di oggetti 'Voto'. C'è anche un array 'ListaRegistri' dove tengo tutti gli oggetti 'Registro'. Tutti questi oggetti(tranne 'Voto' e l'array 'ListaRegistri') hanno dei metodi come 'AggiungiVoto','AggiungiMateria' o 'OttieniMedia' e funzionano quasi sempre. Per esempio dentro questa funzione non posso usare il metodo ottieniMedia() visto che mi dice che non è stata dichiarata la funzione, e in effetti provando dalla console non mi trova nessun metodo eppure ricreando lo stesso percorso dalla console le funzioni ci sono. Però se creo da dentro il codice degli oggetti di test che chiamano gli stessi metodi per aggiungere delle materie e dei voti i metodi invece li trova. Non so quale sia il problema,forse ho dichiarato male le funzioni(cercando su google ho trovando tantissimi modi diversi) o è qualche stranezza del javascript. Il codice è questo:
Spoiler

Codice: Seleziona tutto

var Voto = function (voto, tipo, data, commento,ignora) {
    this.voto = voto;
    this.tipo = tipo;
    this.data = data;
    this.commento = commento;
    if (ignora === undefined) {
        this.ignora = false;
    }
    else {
        this.ignora = ignora;
    }
};
var Materia = function (nome) {
    this.nome = nome;
    this.votiPresenti = 0;
    this.voti = new Array();
    
}
Materia.prototype.aggiungiVoto = function (voto, tipo, data, commento) {
    this.votiPresenti++;
    this.voti.push(new Voto(voto, tipo, data, commento));
};
Materia.prototype.ottieniMedia = function () {
    if (this.votiPresenti == 0)
        return "Non ci sono voti";
    else {
        var media = 0;
        for (i = 0; i < this.votiPresenti; i++) {
            if (!this.voti[i].ignora) {
                media += parseFloat(this.voti[i].voto);
            }
        }
        return (media / this.votiPresenti);
    }
};
Materia.prototype.cancellaVoto = function (index) {
    this.voti.splice(index, 1);
};
var Registro = function(nome,annoRegistro){
    this.materie = new Array();
    this.materiePresenti = 0;
    this.annoRegistro = annoRegistro;
    this.nome = nome;
};
Registro.prototype.aggiungiMateria = function(nome){
    this.materiePresenti++;
    this.materie.push(new Materia(nome));
};
Registro.prototype.cancellaMateria = function (index) {
    this.materie.splice(index, 1);
};

ListaRegistri = new Array();
RegistroSelezionato = 0;

function MostraRegistro(reg) {
    console.log(reg);
    if (reg === undefined) {
        console.log("Argomento non messo. Mostrato registro selezionato(" + String(RegistroSelezionato) + ")");
        reg = ListaRegistri[RegistroSelezionato];
    }
    // Div nel quale creare gli oggetti
    var toAppend = "";
    main = "#main";
    $(main).html("");
    for (i = 0; i < reg.materie.length; i++) {
        toAppend = "";
        toAppend += "<div id='DisplayDiv_" + reg.materie[i].nome + "' >";
        toAppend += "<div class='materia' onclick='MostraMateria(" + i + ");'>";
        // Questa è la linea interessata, vicino a "Media"
        toAppend += "<text class='TestoMaterie'>" + reg.materie[i].nome + "  Media:" + String(reg.materie[i].ottieniMedia() ) + </text'></div>";
        //
        toAppend += "<div class='materiaPlus' onclick='Menu_AggiungiVoto(" + String(i) + ");' >AGGIUNGI VOTO</div>";
        toAppend += "</div>";
        $(main).append(toAppend);
    }
}
L'unica cosa che mi viene in mente è che quando creo un oggetto e lo metto in un array facendo .push(new oggetto) questo non tiene i metodi creati ma non saprei come risovere

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [JS]Un metodo non viene riconosciuto dentro una funzione

Messaggio da civic71 »

Non potrebbe derivare da una var non inizializzata al di fuori della funzione ?

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [JS]Un metodo non viene riconosciuto dentro una funzione

Messaggio da Cash »

civic71 ha scritto:Non potrebbe derivare da una var non inizializzata al di fuori della funzione ?
Ci avevo pensato ma provando a loggare tutti gli oggetti li segna tutti come esistenti e con le loro variabili. Mancano solo i loro metodi quando sono dentro la funzione.
EDIT: Ho scoperto una cosa strana, se nella console faccio 'new Materia' e provo a vedere i metodi dell'oggetto questo non ne ha nessuno dei miei mentre se invece faccio 'm = new Materia' allora 'm' ha tutti i metodi. In effetti io quando aggiungo un nuovo voto/materia faccio semplicemente

Codice: Seleziona tutto

materie.push(new Materia(nomemateria) );
Adesso ho provato a creare l'oggetto prima in una variabile e poi fare materie.push su quell'oggetto ma stesso di prima

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [JS]Un metodo non viene riconosciuto dentro una funzione

Messaggio da Cash »

Risolto!Il problema era che per caricare i registri facevo array.push(JSON.parse(stringaSalvata) ) ma così non creavo un oggetto Materia ma semplicemente un oggetto vuoto al quale poi mettevo le stesse proprietà dell'oggetto Materia ma così perdevo i metodi dichiarati

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 23 ospiti