【问题标题】:Meteor Blaze Bind to Dynamic Variable in LoopMeteor Blaze 绑定到循环中的动态变量
【发布时间】:2015-10-16 21:49:47
【问题描述】:

我有两个商店:学生和作业。每个作业文档都包含学生成绩:

{
  _id: 'assignment_id_here',
  name: 'Homework Assignment 1',
  grades: {
    'id_of_student_1': 88,
    'id_of_student_2': 93,
    'id_of_student_7': 76
  }
}

我的模板可以访问学生的文档和作业。我想显示每个学生的成绩(上面是 88,93 和 76)。

<div>Assignment Name: {{assignment.name}}</div>
<div>Grades</div>
{{#each students}}
  Student {{name}} with student ID {{_id}} received {{assignment.grades[_id]}} on this assignment
{{/each}}

assignment.grades[_id] 不行!什么会起作用?有没有更好的方法来组织这里看到的文档?

【问题讨论】:

    标签: mongodb meteor meteor-blaze


    【解决方案1】:

    这里有两个选项:

    你可以写一个助手:

    Template.registerHelper('getGrade', function (student) {
      return this.data.assignment.grades[student]
    })
    

    或将成绩放入学生的文档中

    【讨论】:

    • 感谢您的回复。我在构建对 getGrade 的调用时遇到问题。首先,“this”变量在循环中直接绑定到学生,所以 this._id 给了我学生 ID。既然student是隐式传给函数的,怎么传作业呢?
    【解决方案2】:

    构建文档的更好方法是采用这种架构,将学生成绩作为嵌入文档的数组:

    {
        _id: 'assignment_id_here',
        name: 'Homework Assignment 1',
        grades: [
            {
                _id: 'id_of_student_1',             
                grade: 88
            },
            {
                _id: 'id_of_student_2',             
                grade: 93
            },
            {
                _id: 'id_of_student_3',             
                grade: 76
            }
        ]    
    }
    

    然后您可以使用 Handlebars 助手来显示嵌入的文档。以下示例演示了这一点(未经测试):

    HTML:

    <head>
        <title>Assignment Example</title>
    </head>
    
    <body>
        {{> course}}
    </body>
    
    <template name="course">
        <ul>
        {{#each assignments}}
            <li>
                <p>Assignment Name: {{name}}</p>
                <p>Grades:
                    {{#display}}    
                        <li>Name : {{name}}</li>
                        <li>Grade : {{grade}}</li>
                    {{/display}}
                </p>
            </li>
        {{/each}}
        </ul>
    </template>
    

    JavaScript:

    Assignments = new Meteor.Collection("assignments");
    Students = new Meteor.Collection("students");
    
    if (Meteor.isClient) {  
        Handlebars.registerHelper('display', function(context, options) {
            var el = "<ul>";
            for(var i=0, j=context.length; i<j; i++) {
                var student = Students.findOne({ "_id": context[i] }),
                    assignment = Assignments.findOne(
                       { "grades._id": context[i] }, 
                       { "grades": { 
                           $elemMatch: { _id: context[i] } 
                          } 
                       });
                if (student && assignment){
                    el += options.fn({name: student.name, grade: assignment.grades[0].grade});
                }
            }
            el += "</ul>"
            return el;
        });
    
        Template.course.assignments = function(){
            return Assignments.find({});
        }
    
        var student_one   = Students.insert({ name: "Student1" }),
            student_two   = Students.insert({ name: "Student1" }),
            student_seven = Students.insert({ name: "Student7" }),
            one     = { _id: student_one, grade: 88 },
            two     = { _id: student_two, grade: 93 },
            seven   = { _id: student_seven, grade: 76 });
    
        Assignments.insert({
            name: "Homework Assignment 1",
            grades: [one, two, three]
        }); 
    }
    
    if (Meteor.isServer) {}
    

    【讨论】:

    • 感谢您的回复。我很好奇,为什么将成绩放在学生身上而不是作业上会更好?我认为我无法摆脱作业集合,因为每个作业都有一些独特的信息不适合学生集合。此外,我的用例有时需要我遍历作业文档。
    • @Dave 经过一番认真的思考,我认为您是对的,在“作业”集合中嵌入仅包含成绩和相应学生 ID 的文档确实更好,让我更新我的答案以反映这一点跨度>
    猜你喜欢
    • 2015-12-28
    • 2017-11-29
    • 2023-03-20
    • 1970-01-01
    • 2019-02-05
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多