Javascript 敲除JS:可观察数组未更新,无法确定原因 背景

Javascript 敲除JS:可观察数组未更新,无法确定原因 背景,javascript,html,knockout.js,ko.observablearray,Javascript,Html,Knockout.js,Ko.observablearray,我有一个非常基本的应用程序,我正在开发,作为淘汰赛的学习练习。在我的视图模型中,我有一个可观察的学生数组。这个对象由许多学生组成,他们是我的模型。每个学生都有一组可观察的分数。分数数组由可观察的数字组成,这些数字被动态推送到分数数组 以上信息描述了我的意图。不幸的是,有东西坏了,但我无法解释在哪里。我的控制台日志显示,当我按下数组时,我的分数数组中的值没有被更新。我不清楚我的逻辑/方法哪里错了。当我尝试更新scores'数组中的平均分数时,最清楚地看到缺少更新 我的内容以及控制台日志可在此处访问

我有一个非常基本的应用程序,我正在开发,作为淘汰赛的学习练习。在我的视图模型中,我有一个可观察的
学生数组
。这个对象由许多学生组成,他们是我的模型。每个学生都有一组可观察的
分数
分数
数组由可观察的数字组成,这些数字被动态推送到
分数
数组

以上信息描述了我的意图。不幸的是,有东西坏了,但我无法解释在哪里。我的控制台日志显示,当我按下数组时,我的分数数组中的值没有被更新。我不清楚我的逻辑/方法哪里错了。当我尝试更新scores'数组中的平均分数时,最清楚地看到缺少更新

我的内容以及控制台日志可在此处访问:

HTML
添加新分配
名称
班级等级
JS 请注意,下面的代码是相关的代码片段,而不是整个应用程序

一,。模型

二,。视图模型

function StudentsViewModel(){
var_this=这个;
this.students=ko.array([
新成绩册。模型。学生模型(“杰夫·史密斯”),
新成绩册。模型。学生模型(“甘道夫”)
]);
this.assignments=ko.array([
新成绩册。模型。工作模型(“数学”),
新成绩册。模型。工作模型(“阅读”)
]);
this.addStudent=函数(){
this.students.push(新成绩册.Model.StudentModel(“”);
this.updateRows();
};
this.addWork=函数(){
这个.assignments.push(新成绩册.Model.WorkModel(“作业”));
this.updateRows();
};
this.updateRows=函数(){
ko.utils.arrayForEach(_this.students(),函数(student){
while(学生成绩().length<_本作业().length){
学生.成绩.推(可观察的高(100));
}
});
};
}
编辑
作为补充说明,我花了相当长的时间研究这个问题,但到目前为止,我遇到的任何解决方案都对我没有帮助

问题在于绑定中的
value:$data
指的是可观察数组条目的未包装的、不可观察的值,而不是可观察的本身

本质上,这使它成为单向绑定—它读取初始状态,然后再也不会更新

自Knockout 3.0以来,您可以使用
$rawData


从文件中:

$rawData

这是当前上下文中的原始视图模型值。通常这个 将与$data相同,但如果提供给Knockout的视图模型 被包装在一个可观察的视图模型中,$数据将是未包装的视图模型, 而$rawData将是可观察对象本身


参考:

好的观点,现在更新。
var StudentModel = (function () {
    function StudentModel(fullName) {
        var _this = this;
        this.fullName = fullName;
        this.scores = ko.observableArray();
        this.mean = ko.computed(function (scores) {
            var n = 0;
            ko.utils.arrayForEach(_this.scores(), function (score) {
                n += score();
                console.log(n);
            });
            n = n / _this.scores().length;
            return n;
        });
    }
function StudentsViewModel() {
    var _this = this;
    this.students = ko.observableArray([
        new Gradebook.Model.StudentModel("Jeff Smith"),
        new Gradebook.Model.StudentModel("Gandalf")
    ]);
    this.assignments = ko.observableArray([
        new Gradebook.Model.WorkModel("Math"),
        new Gradebook.Model.WorkModel("Reading")
    ]);
    this.addStudent = function () {
        this.students.push(new Gradebook.Model.StudentModel(""));
        this.updateRows();
    };
    this.addWork = function () {
        this.assignments.push(new Gradebook.Model.WorkModel("Assignment "));
        this.updateRows();
    };
    this.updateRows = function () {
        ko.utils.arrayForEach(_this.students(), function (student) {
            while (student.scores().length < _this.assignments().length) {
                student.scores.push(ko.observable(100));
            }
        });
    };
}