javascript - 将学生添加到虚拟教室

标签 javascript firebase firebase-realtime-database

在我的网络应用中,有两种用户:教师学生

The Teachers:
- can create classrooms with unique classroom ID
- can view his/her students in each classroom he/she created

The Students
- can join a classroom/s created by a Teacher using classroom IDs
- can view classmates from each he/she joined

对于老师,我使用这些代码来创建教室:

function classcreation(q)
{
    var usuid = generateId();
    var myClasses={};
    myClasses.TheClass = document.getElementById('classroomName').value;
    myClasses.Teacher = user.displayName;
    myClasses.TeacherID = user.uid;
    myClasses.ClassID = usuid;
    fbclass.child(user.uid).push().set(myClasses);
}

以及这些代码来查看每个 user.teachers 创建的教室:

var userRef = firebase.database().ref().child('Classes' + '/' + user.uid);
userRef.on('child_added', function(data)
{
    var roomNames = data.val().TheClass;
    var Studentx = data.val().TheStudents;
    var classD = data.val().ClassID;
    var ul = document.createElement('ul');
    document.getElementById('myList').appendChild(ul);
    var li = document.createElement('li');
    ul.appendChild(li);

    Object.keys(roomNames).forEach(function(key)
    {
        li.innerHTML += '<span 
            onclick="clickDone(this)">'+roomNames[key]+'</span> 
            <ul style="display:none"><li>Class Id : 
            '+classD+'</li><li>Students : '+Studentx+'</li> 
            </ul>';
    });
});

我试图使用这些代码让 user.students 加入类

function addclass() {
    var addclassID = document.getElementById("classroomID").value;
    var checkclassID = firebase.database().ref().child('Classes' + '/' + 
    user.uid);

    userRef.on('child_added', function(data)
    {
        var studentx = data.val().TheStudents;
        var clazzID = data.val().ClassID;
        Object.keys(clazzID).forEach(function(key)
        {
            if(clazzID[key] == addclassID) {
                var myClass{};
                myClass.Studentname= user.displayName;
                checkclassID.child("MyStudents").set(myClass);
            } 
            else
            {
                alert("Class doesnt exist!");
            }
        });
    }}

我认为以下代码不正确:

Object.keys(clazzID).forEach(function(key)
{
    if(clazzID[key] == addclassID) {
        var myClass{};
        myClass.Studentname= user.displayName;
        checkclassID.child("MyStudents").set(myClass);
    } 

我错过了什么?学生加入特定类(class)的替代方式/代码应该是什么?

类图

enter image description here

所以,Classes下面是user.uid,user.uid下面是push()发送的一个随机id,下面是一个类(class)的信息,比如ClassID,Teacher 、TeacherID 和 TheClass,这是类(class)名称。如果一个user.student成功加入了一个教室,同级信息中应该出现一个MyStudents:=> ClassID,Teacher,TeacherID,TheClass,MyStudent。 MyStudents下面是user.student加入教室后应该存放的数据。

如需更多说明,请在下方评论。任何帮助将不胜感激。

JSON:

{
  "Accounts" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "displayName" : "Dodong Advices",
      "email" : "advicenidodong@gmail.com",
      "status" : "Teacher"
    },
  }
  "Classes" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "-LMpvlBl3mEazhxaJwqb" : {
        "ClassID" : "6503-3503-6827",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "StackMates"
      },
      "-LMrfIBg8v-hj1k8X2Qf" : {
        "ClassID" : "7583-2402-2757",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "asdasd"
      },
      "-LMrfMV1aw3YNA0PfooR" : {
        "ClassID" : "8083-2712-3347",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "HAHAHAHA"
      }
    }
  }
}

我要完成的 JSON: ps:我添加了一个新的学生用户

{
  "Accounts" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "displayName" : "Dodong Advices",
      "email" : "advicenidodong@gmail.com",
      "status" : "Teacher"
    },
    "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
      "displayName" : "Sasuke Uchiha",
      "email" : "Sasuke@gmail.com",
      "status" : "Student"
    },
    "yJif4ReTxCcGmo682xWSG3L5MKE3" : {
      "displayName" : "Naruto Uzumaki",
      "email" : "Naruto@gmail.com",
      "status" : "Student"
    },
    "yo9hQLNUtOhSVn9xEhBT7uDI72y1" : {
      "displayName" : "Itachi Uchiha",
      "email" : "Itachi@gmail.com",
      "status" : "Teacher"
    }
  },
  "Classes" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "-LMpvlBl3mEazhxaJwqb" : {
        "ClassID" : "6503-3503-6827",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "StackMates"
      },
      "-LMrfIBg8v-hj1k8X2Qf" : {
        "ClassID" : "7583-2402-2757",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "OverFlowers"
      },
      "-LMrfMV1aw3YNA0PfooR" : {
        "ClassID" : "8083-2712-3347",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "CodeHard"
      }
    },
    "yo9hQLNUtOhSVn9xEhBT7uDI72y1" : {
      "-LMw39kVqsi5sYbudFSk" : {
        "ClassID" : "3514-2160-0317",
        "Teacher" : "Itachi Uchiha",
        "TeacherID" : "yo9hQLNUtOhSVn9xEhBT7uDI72y1",
        "TheClass" : "Akatsuki",
        "MyStudents" : {
           "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
              "StudentName" : "Sasuke Uchiha"
           }
        }
      },
      "-LMw3A_hP2vkKyaowt8J" : {
        "ClassID" : "7647-8387-3883",
        "Teacher" : "Itachi Uchiha",
        "TeacherID" : "yo9hQLNUtOhSVn9xEhBT7uDI72y1",
        "TheClass" : "Konoha",
        "MyStudents" : {
          "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
              "StudentName" : "Sasuke Uchiha",
          "yJif4ReTxCcGmo682xWSG3L5MKE3" : {
              "StudentName" : "Naruto Uzumaki"
           }
          }
        }
      }
    }
  }
}

Result of Mr. Frank's Code

{
  "Accounts" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "displayName" : "Dodong Advices",
      "email" : "advicenidodong@gmail.com",
      "status" : "Teacher"
    },
    "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
      "displayName" : "Sweet Macaroni",
      "email" : "Sweetm@gmail.com",
      "status" : "Student"
    }
  },
  "Classes" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "-LMpvlBl3mEazhxaJwqb" : {
        "ClassID" : "6503-3503-6827",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "StackMates"
      },
      "-LMrfIBg8v-hj1k8X2Qf" : {
        "ClassID" : "7583-2402-2757",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "GoogleHub"
      },
      "7583-2402-2757" : {
        "MyStudents" : {
          "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
            "Studentname" : "Sweet Macaroni"
          }
        }
      }
    }
  }
}

最佳答案

为此,您必须知道两个 UID:一个用于学生,一个用于教师。有了这些,代码就可以非常简单了:

function addclass() {
    var addclassID = document.getElementById("classroomID").value;
    var teacherUID = ...; // ?
    var studentUID = user.uid;
    var studentName = user.displayName;
    var classRef = firebase.database().ref().child('Classes').child(teacherUID).child(addclassID);
    var studentsRef = classRef.child("MyStudents");
    studentsRef.child(studentUID).set({ Studentname: studentName });
}

更新

如评论所述:由于您的类已经拥有自己的唯一 ID,因此我强烈建议您在存储它们时使用它作为键。这就是上面的代码所做的。

在您当前的结构中,您首先必须查询以找到类的键,然后将它写在那里。您的代码是通过加载所有类然后循环来实现的,但是如果您查询会更容易:

function addclass() {
    var addclassID = document.getElementById("classroomID").value;
    var teacherUID = ...; // ?
    var studentUID = user.uid;
    var studentName = user.displayName;
    var classRef = firebase.database().ref().child('Classes').child(teacherUID);
    classRef.orderByChild("ClassID").equalTo(addclassID).once("child_added", function(snapshot) {
      var studentsRef = snapshot.ref.child("MyStudents");
      studentsRef.child(studentUID).set({ Studentname: studentName });
    });
}

关于javascript - 将学生添加到虚拟教室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52479252/

相关文章:

angularjs - 当应用程序在后台时暂停 firebase 连接

javascript - Firebase 获取特定键的所有值

ios - 如何在 Swift 上的 Firebase 中获取嵌套键内的值

javascript - 如何在 Angular JS 中 ng-submit 后隐藏表单

android - 更新到新 SDK 后与 Firebase 数据库失去连接

java - 从 Firebase 数据库获取项目/子项列表?

android - 基于播放服务测量的多个版本请求

javascript - 一键多图像预览

javascript - 变量为 null(仅在 Mozilla 中)

javascript - 对于单独的实例禁用 JS 输入验证提交