2

这是我相关小提琴的链接: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);
        }
    });
};
4

1 回答 1

6

问题是您正在删除您正在迭代的数组的一个元素。

的来源ko.utils.arrayForEach是:

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

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

array.slice(0)

在您的代码中:

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);
        }
    });
};

更新的小提琴在这里

于 2013-01-27T19:14:43.953 回答