在非规范化数据结构列表中呈现每个子项的信息

时间:2015-11-12 00:01:06

标签: angularjs firebase angularfire

假设students的某些数据属于不同groups的类(schools):

{
  "students": {
    "alexa" : {
      "firstName" : "ReJina",
      "grade" : 2,
      "lastName" : "idk",
      ...
    },
    "bobby" : { ... },
    "chris" : { ... },
    ...
  },
  "schools": {
    "springfield" : {
      "name" : "Springfield Elementary",
      "location" : "123 Main St",
      ...
    },
    "quahog" : { ... },
    "zion" : { ... },
    ...
  },
  "group": {
    "one" : {
      "members" : {
        "alexa" : true,
        "bobby" : true,
        "chris" : true
      },
      "school" : {
        "springfield" : true
      },
      "name" : "Math Class"
    },
    "two" : {
      "members" : {
        "bart" : true,
        "lisa" : true,
        "meg" : true,
        ...
      },
      "school" : {
        "quahog" : true
      },
      "name" : "Art Class"
    },
    "three" : { ... },
    "four" : { ... },
    ...
  }
}

据我所知,这是以平面方式构建数据的正确方法。如果这不正确,请告诉我。我保留每个项目的相关列表,因此每个班级都需要一个名册(members),如果我还有一个学生在多个班级(group)或学校的情况,那些会需要他们参加的班级和学校名单。

现在在HTML中,我们需要有一个视图,显示所有学校班级(groups)和每个班级的学生以及同一视图中的学生使用嵌套{{1} }}:

ng-repeat

在控制器中:

<div id="data-table-div" class="col-md-6">
  // Get all the groups, and show them one by one
  <div ng-repeat="group in groups">
    // This works  -  How do I get the school it is associated to?
    //                ??
    {{group.name}} - {{group's school's name}}

    //Start a table
    <table>
      <thead> <tr> <th>Student Name</th> <th>Grade</th> ... </thead>
      <tbody>
        // Get the students in each group, and show them one by one
        //                        ??
        <tr ng-repeat="student in groups.members">
          <td>{{student.name}}</td> <td>{{student.grade}}</td> ...
        </tr>
      </tbody>
    </table>
  </div>
</div>

问题
如何让HTML模板正确迭代angular.module('sofDataViewerApp') .controller('dataTableController', function ($scope, $firebaseObject, $firebaseArray) { // This gets all of our groups. It also allows `group.memebers` to render the appropriate number of `<tr>`s as it knows it has N students. var groupsRef = new Firebase("https://sof-data.firebaseio.com/studyGroups"); $scope.groups = $firebaseArray(groupsRef); // This will give all the students. How do I get just the template's `group.members` to be each appropriate student? var studentsRef = new Firebase("https://sof-data.firebaseio.com/students"); $scope.allStudents = $firebaseArray(studentsRef); }); &#39; groups我可以访问每个members的所有数据(例如他们的studentfirstName)? (我假设它可能涉及控制器中的更好代码,可能还包括HTML)

PLNKR:http://plnkr.co/edit/uAn1Ky9v5NHHDFPs2c6S?p=preview (如果你知道如何在plnkr中注入Firebase和angularFire,那么它应该可行,但我仍然无法解决这个问题,尽管包括它们的CDN ......)

我能理解的最接近的解释是Firebase的this page,他们建议使用grade,但它没有被描述为什么意思,特别是因为他们谈论的不是通过id搜索。就我而言,LINK_IDlink同义,而group则为comment

student

1 个答案:

答案 0 :(得分:1)

看起来你正试图加入多个&#34;表&#34;。使用AngularFire的最佳方法是扩展$firebaseArraylink to docs)。通过这种方式,您可以在添加(或修改)每个子项时从其他位置加载其他数据。

另请参阅Kato的this answer,其中显示了扩展数组(尽管是针对不同的用例)。

最后,您可以考虑将每个屏幕所需的数据复制到该屏幕的列表中。尽管Firebase检索联接数据的速度非常快(它可以保持开放式连接并可以管理多个请求),但如果您需要执行的数据更少,那么它总是会更快。

如果您想显示组中成员的列表,则可以使用此示例:

"group": {
    "one" : {
      "members" : {
        "alexa" : "ReJina",
        "bobby" : "Robert",
        "chris" : "Christian"
        ...

因此,我们实际上不是存储true,而是存储每个成员的名字。这允许我们获取所有数据以通过单个读取操作显示组成员:

ref.child('group/one/members').on('value'...

然后,当用户点击其中一个群组成员时,我们会转到该群组成员的页面并从/students/$studentid加载数据,并且可能拥有他们所在的群组。在那里也是(及那些团体的名字)的一部分..