1

Controls_ListViewWorkingWithDataSources MSDNサンプルを見て、WinJS.Binding.Listからアイテムを削除する方法を確認しました。これが、その解決策です。もっと簡単な方法があると言ってください。

if (list2.selection.count() > 0) {
    list2.selection.getItems().done(function (items) {

        //Sort the selection to ensure its in index order
        items.sort(function CompareForSort(item1, item2) {
            var first = item1.index, second = item2.index;
            if (first === second) {
                return 0;
            }
            else if (first < second) {
                return -1;
            }
            else {
                return 1;
            }
        });

        //Work backwards as the removal will affect the indices of subsequent items
        for (var j = items.length - 1; j >= 0; j--) {
            // To remove the items, call splice on the list, passing in a count and no replacements
            lettersList.splice(items[j].index, 1);
        }
    });
4

3 に答える 3

1

以下を使用して、getItems()呼び出しとthenブロックを回避できますiSelection.getIndices();これにより、削除する必要のあるインデックスを含む配列が得られます。

したがって、コードは次のようになります。これはテストしていません。

// nothing in docs guarantees these are returned in sorted order, so we need to sort
var indicesList = list2.selection.getindices().sort(function(a,b){return a-b}); 
for (var j = indicesList .length - 1; j >= 0; j--) {
    // To remove the items, call splice on the list, passing in a count and no replacements
    lettersList.splice(indicesList[j], 1);
}

次のようなutilyクラスにカプセル化します。

function deleteSelectedItemsFromList(selection, list) {
    var indicesList = selection.getIndices().sort(function(a,b){return a-b}); 
    for (var j = indicesList .length - 1; j >= 0; j--) {
        // To remove the items, call splice on the list, passing in a count and no replacements
        list.splice(indicesList[j], 1);
    }
}

このように呼び出します:

Utils.deletedSelectedItemsFromList(listview.selection, listViewList);

バム、あなたはワンライナーを持っています。

于 2012-12-21T14:27:34.960 に答える
1

MSDNサンプルのアイテムを削除するコードは、それらのアイテムが連続していない可能性がある場合にリストから複数のアイテムを削除することをサポートしているため、より複雑です。list2.selection.getItems()コード内でを使用して、リスト内で現在選択されているすべてのアイテムを取得する場所に注意してください。たとえば、[1,2,3,4,5,6,7,8,9,0]を含むリストがある場合、MSDNサンプルコードを使用すると、ユーザーはアイテム1,2,4、を複数選択して削除できます。リストに[3,5,6,8,0]を残して7,9。

WinJS.Binding.Listから1つのアイテム(または複数の連続するアイテム)を削除するだけの場合は、WinJS.Binding.List.splice()を1回呼び出すだけでこれを実行し、の余分なコードをすべてスキップできます。 MSDNサンプル。

于 2012-12-14T14:17:09.963 に答える
1

私はデータソースでremoveメソッドを使用するので、同じことですが、より長くなります:):

if (list2.selection.count() > 0) {
    list2.selection.getItems().done(function (items) {

    //Sort the selection to ensure its in index order
    items.sort(function CompareForSort(item1, item2) {
        var first = item1.index, second = item2.index;
        if (first === second) {
            return 0;
        }
        else if (first < second) {
            return -1;
        }
        else {
            return 1;
        }
    });

    //Work backwards as the removal will affect the indices of subsequent items
    for (var j = items.length - 1; j >= 0; j--) {

             var _dataSource = list2.itemDataSource;
             //Start the sequence of edits
             _dataSource.beginEdits();

             //Get new Items that will be added to the existing item source
             var newItems = { "id": selection[i].data.id, "name": selection[i].data.name };
             //remove the last item
             _dataSource.remove(_dataSource.itemFromIndex(indicesList[j])._value.key);

             //YOU CAN EVEN ADD A NEW ITEM IF YOU WANT
             //_dataSource.insertAtStart(null, newItems);

             //Ends the batch of edits
             _dataSource.endEdits();

    }
});

}
于 2014-01-21T15:42:16.077 に答える