我在尝试从可剔除可观察数组中的每个项目中获取一个数字并将这些数字相加并将其分配给另一个计算变量时遇到了麻烦。这就是我现在所拥有的...

Semesters: ko.observableArray([
    {
        semesterName: "Fall",
        semesterCode: "300",
        PlannedCourses: ko.observableArray([]),
        totalCredits: ko.computed(function(){
            var total = 0;
            ko.utils.arrayForEach(this.PlannedCourses, function (course) {
                total += course.MinHours();
            });

            return total;
        }),
    },
    ...


我想做的是,在totalCredits变量中,我试图遍历PlannedCourses数组,获取每个项目的MinHours变量,并将它们加到total变量中。然后,将其返回到Semesters数组中的totalCredits项目。我遇到的问题是在ko.utils.arrayForEach部分获得了PlannedCourses变量。我对此不确定,我不确定为什么。我认为这是一个简单的语法错误,但我看不出有什么问题。

PlannedCourses可观察数组是一个动态对象,可以正确获取PlannedCourses列表。它是在其自身的上下文中定义的,但是我没有正确地将其传递给totalCredits计算函数。

我希望这足够清楚。谢谢您的帮助!

注意:其余所有代码均按预期工作。唯一不起作用的部分是totalCredits计算函数。我不确定ko.utils.arrayForEach中是否有任何工作,因为我还没走得那么远。

最佳答案

您将需要更改填充Semesters可观察数组的方式以使用构造函数,以便获得对this正确范围的引用:

function semester(name, code) {
    this.Name = name;
    this.Code = code;
    this.PlannedCourses = ko.observableArray([]);
    this.totalCredits = ko.computed(function(){
        var total = 0;
        ko.utils.arrayForEach(this.PlannedCourses(), function (course) {
            //Note the change to "this.PlannedCourses()" above to get the underlying array
            total += course.MinHours();
        });

        return total;
    }, this); //now we can pass "this" as the context for the computed
}


了解我们现在如何将对象传递给ko.computed的第二个参数,以用作内部函数中this的上下文。有关更多信息,请参见敲除文档:Managing 'this'

然后,在填充数组时创建semester的新实例:

Semesters: ko.observableArray([
    new semester("Fall", "300"),
    new semester(...)
]);


这种方法还意味着您可以用一种一致的方式来创建semester对象(计算出的内容只能为一件事定义一次),而不必在最初可能出现的任何重复中都包含错别字等。

08-17 13:13