0

選択したアイテムをリストボックスの一番上に表示するための解決策を見つけることに本当に夢中になっています。ここではノックアウトを使用して、リスト ボックスをバインドしています。私の見解では、リストボックスは以下のようにバインドされています

<select id ="multiAltVersion" multiple="multiple"  data-bind="options:  $root.editOnlyAlternativeVersions,  optionsText: 'PlatformVersionName',optionsValue: 'Id',selectedOptions:  $root.copiedAltVersion, chosen: true  "> </select>

WCF サービスを呼び出してリストボックスを埋めます。

    function loadVersionListByProductType(prodtype) {
        var input =
        {
            ProductType: prodtype

        };


        $.ajax({
            url: "../RestService/Test/ReturnData",
            type: "PUT",
            contentType: 'application/json',
            processData: false,
            data: JSON.stringify(input),
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(errorThrown);
            },
            success: function (allData) {
                var mappedVersionListByProdType = $.map(allData, function (item) {

                    return new productVersionListByProductType(item);
                });
                self.editOnlyAlternativeVersions(mappedVersionListByProdType);


            }

        });

    }

データが WCF サービスから返されると、降順でデータが返されます。しかし、選択したものを一番上に表示してから、リストを降順に並べ替えたいと思います。別のサービスからアイテムのリストを取得し、別のサービスから選択したアイテムを取得します。それは理にかなっていますか?Jqueryを使用してどのように達成できますか?

4

2 に答える 2

0

計算されたオブザーバブルを使用した簡単な例 (未テストおよび未最適化):

var myViewModel = function() {
   var options = ko.observableArray(["option1","option2","option3"]);
   var selected = ko.observable(options[2]);

   var sortedOptions = ko.computed(function() {
       var sorted = [];
       sorted.push(selected());
       for (var i=0; i < options().length; i++) {
           if(options()[i]!=selected()) {
              sorted.push(options()[i]);
           }
       }
       return sorted;
   });
}

次にバインドしsortedOptions、次の順序にする必要があります。

option3, option1, option2

options新しいオプションを選択すると、配列に新しいオプションを追加する場合と同様に、強制的に再計算されます。

于 2013-03-04T14:12:23.113 に答える
0

データをダウンロードするときに、Knockoutの並べ替え機能を使用できます。

editOnlyAlternativeVersions.sort(function(left, right)
{
    return left.selected == right.selected ? 
        // Selected is equal, so sort on name
        left.name == right.name ? 0 : (left.name < right.name ? -1 : 1) : (left.selected < right.selected ? -1 : 1)
})
于 2013-03-04T14:04:23.517 に答える