Próbowałem utworzyć aplikację o nazwie Workspace. Wcześniej zadałem inne pytanie, ale teraz dodałem więcej funkcji. Istnieje system uwag. Próbowałem używać różnych wersji mojego kodu i kod, który podałem, ma najlepszą wersję, jaką stworzyłem. Nie mogę znaleźć odpowiedzi na swoje pytanie w sieci, więc musiałem zadać je tutaj.

var ref = firebase.database().ref(); 

function stdRemarks(studentName){
    let finalStuff;
    ref.on("value", function(snapshot){
        let keys = Object.keys(snapshot.val().schools[returnCurrentUser()][studentName]['remarks']);
        for(i=0;i<keys.length;i++){
            let objectToDealWith = snapshot.val().schools[returnCurrentUser()][studentName]['remarks'];
            let remark = objectToDealWith[keys[i]]['remark'];
            let examiner = objectToDealWith[keys[i]]['examiner'];
            let fullRemark = ` ${examiner}: ${remark} | `
            finalStuff +=  fullRemark;
        }
        return finalStuff;
    });
}

ref.on("value", function(snapshot){
     let dashTab = document.getElementById("dashboard_table");
     let btn = document.getElementById("csv_blob");
     let btn2 = document.getElementById("json_view");
     let btn3 = document.getElementById("json_export");
     btn.style.display = "block";
     btn2.style.display = "block";
     $("#json_export").css('display', 'block');
     dashTab.innerHTML = "<thead><tr><th>Student Name</th><th>Class</th><th>Email</th><th>Subject</th><th>Project Info</th><th>Remarks</th><th>Project</th><th style='display: none;'>Project Download URL</th><th>Add Remark</th></tr></thead>";
     let jsonRecieved = snapshot.val();
     let objectToDealWith = snapshot.val().schools[returnCurrentUser()];
     let lengthOfIt = Object.size(objectToDealWith);
     for(i=0;i<lengthOfIt;i++){
        let int = i + 1;
        let names = Object.keys(objectToDealWith);
        let stdName = names[i];
        let finalResult = objectToDealWith[stdName];
        document.getElementById("schoolnameis").innerText = "Dashboard - " + objectToDealWith['i'];
        let stdClass = finalResult['class'];
        let stdEmail = finalResult['email'];
        let stdSubject = finalResult['subject'];
        let stdiName = finalResult['stdname'];
        let stdProjectName = finalResult['projectname']
        let stdProjectInfo = finalResult['projectinfo'];
        let stdProjectLink = finalResult['projectlink'];
        console.log(stdRemarks(stdiName))
        let elementToPush = `<tr><td>${stdiName.replace(/undefined/g, '')}</td><td>${stdClass.replace(/undefined/g, '')}</td><td>${stdEmail.replace(/undefined/g, '')}</td><td>${stdSubject.replace(/undefined/g, '')}</td><td>${stdProjectInfo.replace(/undefined/g, '')}</td><td>${stdRemarks(stdnameName).replace(/undefined/g, '')}</td><td><a href=${stdProjectLink}>${stdProjectName.replace(/undefined/g, '')}</a></td><td style='display:none;'>${stdProjectLink}</td><td id="${stdName}" style='text-align:center;' onclick="closeThatSomeThing();getIdOfTd(this.id)">&#x2795</td></tr>`;
        dashTab.innerHTML += elementToPush;
     }
});

Więc wszystko działa dobrze, ale niektóre rzeczy wydają się psuć cały kod. Moja baza danych wygląda mniej więcej tak Zobacz

Oto błąd.

//A warning by firebase.
@firebase/database: FIREBASE WARNING: Exception was thrown by user callback. TypeError: Cannot read property 'replace' of undefined

//An error occuring on the variable `elementToPush` and its part ${stdRemarks(stdnameName).replace(/undefined/g, '') in the code.
Cannot read property 'replace' of undefined

Muszę jutro przesłać ten projekt.

0
SWAGBEAST Developers 19 listopad 2019, 16:33
Zmieniłem kod. Działa teraz, ale nie zapętla się dla wszystkich wpisów. Użyłem kodu w ref.on i działa tylko dla 1 wpisu... Oto kod. Jakieś sugestie, jak to działa?
 – 
SWAGBEAST Developers
19 listopad 2019, 17:04

2 odpowiedzi

Twoja funkcja „stdRemarks” zwraca typ „void”. albo zwróć kompletną ref.on (), albo przenieś „finalstuff” poza wywołanie funkcji .on () i upewnij się, że funkcja „stdRemarks” ma żądany typ zwrotu. w tym przypadku byłby to „ciąg”;

function stdRemarks(studentName){
    let finalStuff = "";
    ref.on("value", function(snapshot){
        let keys = Object.keys(snapshot.val().schools[returnCurrentUser()][studentName]['remarks']);
        for(i=0;i<keys.length;i++){
            let objectToDealWith = snapshot.val().schools[returnCurrentUser()][studentName]['remarks'];
            let remark = objectToDealWith[keys[i]]['remark'];
            let examiner = objectToDealWith[keys[i]]['examiner'];
            let fullRemark = ` ${examiner}: ${remark} | `
            finalStuff +=  fullRemark;
        }
    });
     return finalStuff;
}
0
stijn nel 19 listopad 2019, 17:05
To naprawi błąd spowodowany próbą .replace() na czymś, co jest niezdefiniowane. Nie wiem jak działa firebase ani jego funkcje....
 – 
stijn nel
19 listopad 2019, 17:06
To działa. Nadal daje mi błąd, że .replace nie jest zdefiniowany. Zgodnie z typem danych js automatycznie uczyni z niego string lub int. I wciąż zwraca tę niezdefiniowaną rzecz.
 – 
SWAGBEAST Developers
19 listopad 2019, 17:12

Zrobiłem to za pomocą tego kodu.

ref.on("value", function(snapshot){
     let dashTab = document.getElementById("dashboard_table");
     let btn = document.getElementById("csv_blob");
     let btn2 = document.getElementById("json_view");
     let btn3 = document.getElementById("json_export");
     btn.style.display = "block";
     btn2.style.display = "block";
     $("#json_export").css('display', 'block');
     dashTab.innerHTML = "<thead><tr><th>Student Name</th><th>Class</th><th>Email</th><th>Subject</th><th>Project Info</th><th>Remarks</th><th>Project</th><th style='display: none;'>Project Download URL</th><th>Add Remark</th></tr></thead>";
     let jsonRecieved = snapshot.val();
     let objectToDealWith = snapshot.val().schools[returnCurrentUser()];
     let lengthOfIt = Object.size(objectToDealWith)-1;
     for(i=0;i<lengthOfIt;i++){
        let finalRemark;
        let int = i + 1;
        let names = Object.keys(objectToDealWith);
        let stdName = names[i];
        let finalResult = objectToDealWith[stdName];
        let stdClass = finalResult['class'];
        let stdEmail = finalResult['email'];
        let stdSubject = finalResult['subject'];
        let stdiName = finalResult['stdname'];
        for(var e=0;e<Object.size(objectToDealWith[stdName]['remarks']);e++){
            let keys = Object.keys(objectToDealWith[stdName]['remarks']);

            let remark = objectToDealWith[stdName]['remarks'][keys[e]]['remark'];
            let examiner =  objectToDealWith[stdName]['remarks'][keys[e]]['examiner'];
            let completeRemark = ` | ${examiner} : ${remark}  `
            finalRemark += completeRemark;
        }

        let stdProjectName = finalResult['projectname']
        let stdProjectInfo = finalResult['projectinfo'];
        let stdProjectLink = finalResult['projectlink'];
        let elementToPush = `<tr><td>${stdiName}</td><td>${stdClass}</td><td>${stdEmail}</td><td>${stdSubject}</td><td>${stdProjectInfo}</td><td>${finalRemark.replace(/undefined/g, '')}</td><td><a href=${stdProjectLink}>${stdProjectName}</a></td><td style='display:none;'>${stdProjectLink}</td><td id="${stdName}" style='text-align:center;' onclick="closeThatSomeThing();getIdOfTd(this.id)">&#x2795</td></tr>`;
        dashTab.innerHTML += elementToPush;
     }
});

To, co tutaj zrobiłem, to to, że zmieniłem i na e w drugiej pętli i zadziałało ...

0
SWAGBEAST Developers 19 listopad 2019, 17:57