Javascript TypeError:无法读取属性';pushObject';未定义的

Javascript TypeError:无法读取属性';pushObject';未定义的,javascript,jquery,ember.js,Javascript,Jquery,Ember.js,在给出任何代码片段之前,我想解释一下我必须实现的任务 首先,每个班级都有很多科目,每个班级都有很多学生。每个科目和学生都属于一个班级。而且,每个科目和学生都有很多分数。但是一个年级属于一个科目和一个学生 我想首先在控制器中检查是否有一个等级带有这些参数(学生和科目),然后如果有那个等级,只需更新marks属性(我在app/transforms中拥有的“数组”类型)。下面是controller app/controllers/overview of students.js: 从“余烬”导入余烬;

在给出任何代码片段之前,我想解释一下我必须实现的任务

首先,每个班级都有很多科目,每个班级都有很多学生。每个科目和学生都属于一个班级。而且,每个科目和学生都有很多分数。但是一个年级属于一个科目和一个学生

我想首先在控制器中检查是否有一个等级带有这些参数(学生和科目),然后如果有那个等级,只需更新marks属性(我在app/transforms中拥有的“数组”类型)。下面是controller app/controllers/overview of students.js:

从“余烬”导入余烬;
导出默认的Ember.Controller.extend({
显示:错误,
马克:“,
行动:{
节目主题(){
this.toggleProperty('showS');
},
插入标记(val,val2){
var subject2=this.get('store').peek记录('subject',val2);
var student=this.get('store').peek记录('student',val);
var mark2=this.get('mark');
this.get('store').query('grade'){
过滤器:{
学生:学生,
主题:主题2
}
}).然后(功能(标记){
如果(标记==null){
this.get('store').createRecord('grade'){
马克:[mark2],
学生:学生,
主题:主题2
}).save().then(函数(等级){
student.get('marks').pushObject(mark2);
student.save();
subject2.get('grades').pushObject(mark2);
subject2.save();
});
}否则{
mark.get('marks').pushObject(mark2);
mark.save();
}
});
}
}
});因此,您正在执行的操作将返回一个承诺,该承诺将使用which extends解析,which extends可以在其中找到您可以使用的所有可枚举方法。
您需要使用结果的firstObject,您可以在下面的代码中找到

insertMark(val, val2) {
    var subject2 = this.get('store').peekRecord('subject', val2);
    var student = this.get('store').peekRecord('student', val);
    var mark2 = this.get('mark');

    this.get('store').query('grade', {
        filter: {
            student: student,
            subject: subject2
        }
    }).then(function(mark) {
        if (mark == null) {
            ...
        } else {
            //Here mark is AdapterPouplatedRecordArray. so please confirm are you receiving the result.
            console.log(' Mark ', mark);
            //You need to use firstObject
            mark.get('firstObject').get('marks').pushObject(mark2);
            mark.get('firstObject').save();
        }
    });
}

如果此查询将始终返回单个记录,则可以尝试使用queryRecord而不是query。为此,您需要实现后端来接受并返回响应。

您知道错误发生在哪个pushObject调用上吗?你能提供你的转换代码吗?@Igor最后一个:“mark.get('marks').pushObject(mark2);”。数组转换是可以的,因为我在其他函数中使用了多次。但这里是:您正在执行一个“this.get('store').query”,它将生成一个标记数组,而不仅仅是一个标记。尝试执行“this.get('store').queryRecord”,然后看看它是否有效。@Igor是这样,我尝试过,但收到错误:“断言失败:您试图进行查询,但您的适配器未实现‘queryRecord’”。我用的是余烬火,也就是火基。我搜索了这个错误,发现我们应该把limit:1作为过滤器的属性之一。但当我这样做时,我收到了与我开始时相同的错误:“TypeError:无法读取未定义的属性‘pushObject’”。所以,我认为我的错误是在那之后,因为我得到了我开始的东西。也就是说,我得到了相同的错误。@Igor这就像我不能通过第一行,然后是:mark.get('marks').pushObject(mark2);适配器(firebase)不支持(40行)queryRecord,我们应该改为使用筛选器limitToLast:1中的属性。我仍然在console.log之后收到相同的错误“TypeError:无法读取未定义的属性'get'。你能执行if和else命令吗。不仅仅是别的。提前谢谢!很抱歉,你必须一个接一个地实施它。我不熟悉余烬数据。只需创建记录并更新所有内容,然后保存<代码>student.get('marks').pushObject(mark2)->您尚未在学生模型中定义
标记,。还有
subject2.get('grades')
->主题模型没有定义
grades
属性。因此,我更正了student属性并将其重命名为grades,并且主题模型确实有前面定义的grades属性。再看一遍。我已经检查了else块,它的工作方式与我在前面的评论中所写的不一样。我不知道我写的if block是否正确,我能用这个吗。在if block中加入('store')吗?你在这里提出了一个有效点,你可以在外面定义store,在里面使用它
,然后
block,或者像
那样使用箭头函数。然后(mark=>{//You can use this reference})
我试过了,但它不起作用。同样的错误在else块之后出现。请检查这个问题,看看你是否能解决它…它与这个问题有关…这个问题的解决方案就是我的问题的解决方案