"无法读取未定义的属性'x'

Mik*_*azz 2 knockout.js

这是我相关小提琴的链接:http://jsfiddle.net/mwassmer/Kwmn5/

我正在尝试使用户能够将第一个表(可用数据库字段)中的一行或多行移动到第二个表(要保存到用户的自定义"数据集"的字段),反之亦然.

当"addSelected"事件处理程序运行时,我得到"无法读取属性'isChecked'未定义"错误,除非检查了最后一行和最后一行.我仍然试图将我的大脑包围在Knockout的背景下正确使用"this",所以我认为这个问题与我滥用"this"有关.任何帮助,将不胜感激.

相关代码摘录如下:

 self.addSelected = function() {
    ko.utils.arrayForEach(self.dbRows(), function(row)
    {
        if (row.isChecked) {
            row.isChecked = false;
            self.dsRows.push(row);
            self.dbRows.remove(row);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

del*_*xfe 6

问题是您正在删除正在迭代的数组元素.

ko.utils.arrayForEach的来源是:

   var arrayForEach =  function (array, action) {
        for (var i = 0, j = array.length; i < j; i++)
            action(array[i]);
    }
Run Code Online (Sandbox Code Playgroud)

解决这个问题的一种方法是在删除元素之前创建数组的副本.你可以这样做

array.slice(0)
Run Code Online (Sandbox Code Playgroud)

在你的代码中:

self.addSelected = function() {
    ko.utils.arrayForEach(self.dbRows().slice(0), function(row)
    {
        if (row.isChecked) {
            row.isChecked = false;
            self.dsRows.push(row);
            self.dbRows.remove(row);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

更新的小提琴位于:http://jsfiddle.net/delixfe/xY3xk/