【问题标题】:How to make a nested List?如何制作嵌套列表?
【发布时间】:2018-09-25 12:57:42
【问题描述】:

所以在我尝试制作的网络应用程序中,有两种类型的用户:教师学生

老师
- 可以创建教室
- 可以查看加入他/她的教室的学生

学生
- 可以加入由教师创建的教室
- 可以查看加入同一个房间的教室和同学

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

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);
}

这些代码供学生加入课堂

function addclass(){
       var addclassID = document.getElementById("classroomID").value;
       var teacherUID =document.getElementById("teachID").value;
       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 });
       });

这些代码允许教师查看他/她创建的教室

  var userRef = firebase.database().ref().child('Classes' + '/' + user.uid);
        userRef.on('child_added', function(data)
        {
              var roomNames = data.val().TheClass;
              var Studentx = data.val().MyStudents;
              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>';
                });
              });

我的 JSON 是什么样子的

{
  "Accounts" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "displayName" : "Dodong Advices",
      "email" : "advicenidodong@gmail.com",
      "status" : "Teacher"
    },
    "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
      "displayName" : "Sweet Macaroni",
      "email" : "Sweet@gmail.com",
      "status" : "Student"
    },
    "yJif4ReTxCcGmo682xWSG3L5MKE3" : {
      "displayName" : "Purple Salad",
      "email" : "Purple@gmail.com",
      "status" : "Student"
    }
  },
  "Classes" : {
    "FykyhzEZjndylFj3BbCnPqoTGDo1" : {
      "-LMpvlBl3mEazhxaJwqb" : {
        "ClassID" : "6503-3503-6827",
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "StackMates"
      },
      "-LMrfIBg8v-hj1k8X2Qf" : {
        "ClassID" : "7583-2402-2757",
        "MyStudents" : {
          "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
            "Studentname" : "Sweet Macaroni"
          }
        },
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "asdasd"
      },
      "-LMrfMV1aw3YNA0PfooR" : {
        "ClassID" : "8083-2712-3347",
        "MyStudents" : {
          "HOgdSlTed9V8g0kSZjizgODMDOe2" : {
            "Studentname" : "Sweet Macaroni"
          },
          "yJif4ReTxCcGmo682xWSG3L5MKE3" : {
            "Studentname" : "Purple Salad"
          }
        },
        "Teacher" : "Dodong Advices",
        "TeacherID" : "FykyhzEZjndylFj3BbCnPqoTGDo1",
        "TheClass" : "Trial"
      }
    }
  }
 }

根据 JSON,我们可以看到我们有 3 个用户。紫色沙拉、甜通心粉(都是学生)和一位名叫 Dodong Advices 的老师

所以 Dodong Advices 有 3 个教室:StackMatesasdasdTrial

StackMates 班级中,Dodong Advices 没有学生,但在班级 asdasd 他有一个名为 Sweet Macaroni 的学生和班里的 2 名学生 试用

下面的代码允许用户Dodong Advices查看他创建的教室。

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

但不是加入他的一间教室的学生。

上图是结果

我尝试使用此代码显示教室列表和每个教室内的学生列表:

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

但它没有奏效。什么是最好的解决方案?我真的需要你的帮助:(

【问题讨论】:

    标签: javascript firebase web firebase-realtime-database


    【解决方案1】:

    通过data.val().MyStudents 你得到一个JavaScript 对象。您必须遍历该对象的元素才能列出不同的学生。

    许多不同的方法来获取对象的属性,请参阅How to get all properties values of a Javascript Object (without knowing the keys)?

    例如,您可以简单地执行类似

    的操作
      var userRef = firebase.database().ref().child('Classes' + '/' + user.uid);
            userRef.on('child_added', function(data)
            {
                  var roomNames = data.val().TheClass;
                  var Studentx = data.val().MyStudents;
    
                  var studentRawList = '';
                  for (var key in Studentx) {
                      studentRawList += (Studentx[key].Studentname + '/');
                  }
    
                  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 : '+studentRawList+'</li></ul>';
                    });
                  });
    

    这是非常初级的,您可能应该使用studentRawList 字符串的格式,但它向您展示了一种可能的方式。


    此外,请注意,有几个 JavaScript 框架可以分离您的 GUI 和数据模型(来自 Firebase),并编写更简洁、更易于维护的代码。当然有一个学习曲线(有时相当陡峭......),但它可能值得一看。例如,请参阅 Vue.js、React、Angular 或 Knockout.js(更容易学习,但占用空间更小,功能更弱,恕我直言),

    【讨论】:

    • 非常感谢这位先生。雷诺。我稍后再试试。这里已经快凌晨 4 点了。
    • 顺便说一句,我需要在代码中添加一些东西还是直接复制粘贴?
    • 只需复制/粘贴,但正如我所说,您需要微调(格式化字符串,检查 Studentx 的可能未定义值等)现在由您决定!晚安:-)
    • 非常感谢。非常感谢您的帮助!
    • 成功了,先生!如果我希望学生查看或查看他/她加入的课程以及他/她的同学,我是否仍会使用相同的流程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多