javascript - knockout arrayForEach 未定义的属性

标签 javascript function knockout.js

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

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 的上下文。有关详细信息,请参阅 knockout 文档:Managing 'this' .

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

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

这种方法还意味着您可以以一致的方式创建您的semester 对象(计算只为一件事定义一次),而不是可能在您最初可能有的任何重复中加入拼写错误等.

关于javascript - knockout arrayForEach 未定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857463/

相关文章:

function - 在 SAS proc fcmp 中如何返回 2 个数字

matlab - MATLAB 函数的返回值是否取决于它的调用方式?

knockout.js - 我需要帮助使用 Knockout 格式化数据绑定(bind)

javascript - knockout js foreach循环上下文

javascript - 当某些对象必须避免配对在一起时,如何将一个数组的元素随机映射到另一个数组的元素?

javascript - Google Map API V3 - 点击 Marker 将更多信息内容显示为叠加层(就像在 Google Maps 中一样)

PHP get_meta_tags() 没有像我预期的那样工作

javascript - 如何在 Visual Studio 2012 for Windows 8 中使用 JavaScript 运行外部可执行文件

javascript - 在新的 WordPress PHP 文件中访问 $wpdb, "require wp-load.php"不起作用

javascript - 在 knockout viewmodel 页面中手动触发其他 DOM 元素的点击事件