Ember.js 将迭代对象传递给控制器方法

Ember.js 将迭代对象传递给控制器方法,ember.js,controller,Ember.js,Controller,尝试将迭代对象传递给控制器方法时,该对象将作为字符串传递 模板: <script type="text/x-handlebars" data-template-name="gradebooks"> {{#each}} {{#link-to "gradebook" this}}{{title}}{{/link-to}} {{/each}} {{outlet}} </script> <script type="text/x-handlebars"

尝试将迭代对象传递给控制器方法时,该对象将作为字符串传递

模板:

<script type="text/x-handlebars" data-template-name="gradebooks">
  {{#each}}
    {{#link-to "gradebook" this}}{{title}}{{/link-to}}
  {{/each}}
  {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="gradebook">
  <h1>Student Grades</h1>
  {{#each student in students}}
    {{#each assignment in assignments}}
      {{student.name}}, {{assignment.name}}: {{getGrade student assignment}}%
    {{/each}}
  {{/each}}
</script>
控制器:

App.GradebookController = Ember.ObjectController.extend({
  getGrade: function(student, assignment) {
    console.log(student, assignment);
    return 5;
  }
});
型号:

App.Gradebook = DS.Model.extend({
  title: DS.attr('string'),
  students: DS.hasMany('student', { async: true}),
  assignments: DS.hasMany('assignment', { async: true})
});
App.Student = DS.Model.extend({
  name: DS.attr('string'),
  gradebook: DS.belongsTo('gradebook'),
  grades: DS.hasMany('grade', { async: true })
});
App.Assignment = DS.Model.extend({
  name: DS.attr('string'),
  gradebook: DS.belongsTo('gradebook'),
  grades: DS.hasMany('grade', { async: true })
});
App.Grade = DS.Model.extend({
  score: DS.attr('number'),
  student: DS.belongsTo('student'),
  assignment: DS.belongsTo('assignment')
});

目前,上面为每个学生输出字符串
“student”
。如果我有
{{getGrade student.id}
,它将输出字符串
“student.id”
。我怎样才能让它作为一个对象通过学生的考试?

鉴于你的修订,我在下面修订了我的答案,以便更好地对齐:

App.AssignmentController = Ember.ObjectController.extend({
   needs: ["student"],
   getGrade: function() {
      var student = this.get('controllers.student');
      //logic to get grade
   }.property() //thing to observe for changes
});


<script type="text/x-handlebars" data-template-name="gradebooks">
  <h1>Student Grades</h1>
  {{#each}}
    {{#link-to "gradebook" this}}{{title}}{{/link-to}}
  {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="gradebook">
  {{#each student in students}}
     {{render 'student' student}}
  {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="student">
   {{name}} 
   {{#each assignment in assignments}}
     {{render 'assignment' assignment}}
   {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="assignment">
   {{name}}: {{getGrade}}%
</script>
App.AssignmentController=Ember.ObjectController.extend({
需要:[“学生”],
getGrade:函数(){
var student=this.get('controllers.student');
//获得分数的逻辑
}.property()//要观察更改的内容
});
学生成绩
{{{#各}
{{{#链接到“成绩册”本}{{{title}{{{/链接到}}
{{/每个}}
{{{学生中的每个学生}
{{呈现“学生”学生}
{{/每个}}
{{name}}
{{{#作业中的每个作业}
{{呈现“赋值”赋值}
{{/每个}}
{{name}}:{{getGrade}}%
一个有用的工具是{{log model}}或{{log record}或{{log…whatver..}来了解视图接收到的数据

如果您打开Chrome Ember Inspector,您还应该看到定义了哪些视图、控制器、路线、模型等,这将有助于理解

简而言之,您不能使用{{getGrade student.id}将参数传递给控制器-您可以定义一个Handelbars助手来接受参数,但我认为这不是您想要的。上述方法对我有效


希望这有助于

以这种方式定义它不会对我起作用,因为我的完整示例既有
学生
也有
成绩
。我将编辑我的问题以显示更完整的示例。
App.AssignmentController = Ember.ObjectController.extend({
   needs: ["student"],
   getGrade: function() {
      var student = this.get('controllers.student');
      //logic to get grade
   }.property() //thing to observe for changes
});


<script type="text/x-handlebars" data-template-name="gradebooks">
  <h1>Student Grades</h1>
  {{#each}}
    {{#link-to "gradebook" this}}{{title}}{{/link-to}}
  {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="gradebook">
  {{#each student in students}}
     {{render 'student' student}}
  {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="student">
   {{name}} 
   {{#each assignment in assignments}}
     {{render 'assignment' assignment}}
   {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="assignment">
   {{name}}: {{getGrade}}%
</script>