2

関連するフィドルへのリンクは次のとおりです。http://jsfiddle.net/mwassmer/Kwmn5/

ユーザーが 1 つ以上の行を最初のテーブル (利用可能なデータベース フィールド) から 2 番目のテーブル (ユーザーのカスタム "データセット" に保存されるフィールド) に、またはその逆に移動できるようにしようとしています。

最後の行のみがチェックされていない限り、「addSelected」イベント ハンドラーが実行されると、「未定義のプロパティ 'isChecked' を読み取ることができません」というエラーが表示されます。私はまだノックアウトのコンテキストで「これ」を適切に使用する方法について頭を悩ませているので、問題は「これ」の誤用に関係していると思います。どんな助けでも大歓迎です。

関連するコードの抜粋は次のとおりです。

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

これを解決する1つの方法は、要素を削除する前に配列のコピーを作成することです。あなたはそれを行うことができます:

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 に答える