0

選択ドロップダウンボックスとデータのリストがあります。ドロップダウン ボックスには、データ リストの列の名前が含まれています。そのデータのリストは、allCertificates と呼ばれる監視可能な配列にバインドされます。ユーザーがドロップダウン ボックスから列名を選択すると、change イベントが発生します。ドロップダウンリストからの選択に基づいてデータのリストをソートしたい。SortBy 関数で allCertificates 観測可能配列をソートし、それをデータのリストに再バインドする予定ですが、これを実装する方法がわかりません。SortBy 関数のコードは何ですか?

これが私のビューコード(CAApproval.html)の選択リストです-

    <select id="ddlSortBy" style="margin-top: 0px; height: 24px; width: 140px !important"
        data-bind="change: SortBy(), options: serverOptions, optionsText: 'name', optionsValue: 'id', value: 'OptionText'">
    </select>

allCertificates オブザーバブル配列にバインドされているデータのリストは次のとおりです。

                        <ol data-bind="foreach: allCertificates">
                        <table id="Table2" border="0" class="table table-hover" width="100%">
                            <tr style="cursor: hand">
                                <td>
                                    <ul style="width: 100%">
                                        <b><span data-bind="    text: clientName"></span>&nbsp;(<span data-bind="    text: clientNumber"></span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span data-bind="    text: borrowBaseCount"></span>&nbsp;Loan(s)&nbsp;</b>
                                        <br />
                                        Collateral Analyst:&nbsp;<span data-bind="    text: userName"></span>
                                        <br />
                                        Certificate:&nbsp;<span data-bind="text: lwCertID"></span>&nbsp;&nbsp;Request&nbsp;Date:&nbsp;<span data-bind="    text: moment(requestDate).format('DD/MMM/YYYY')"></span>
                                </td>
                            </tr>
                        </table>

ここに、空の SortBy 関数を使用したビューモデル コードを示します (SortBy は、監視可能な配列を並べ替えて、データのリストに再バインドする場所です)-

define(['services/logger', 'durandal/system', 'durandal/plugins/router', 'services/CertificateDataService'],
function (logger, system, router, CertificateDataService) {
    var allCertificates = ko.observableArray();
    var myCertificates = ko.observableArray();

    var serverOptions = [
    { id: 1, name: 'Certificate', OptionText: 'lwCertID' },
    { id: 2, name: 'Client Name', OptionText: 'clientName' },
    { id: 3, name: 'Client Number', OptionText: 'clientNumber' },
    { id: 4, name: 'Request Date', OptionText: 'requestDate' },
    { id: 4, name: 'Collateral Analyst', OptionText: 'userName' }
    ];

    var activate = function () {

        // go get local data, if we have it
        return SelectAllCerts();

    };


    var vm = {
        activate: activate,
        allCertificates: allCertificates,
        myCertificates: myCertificates,
        title: 'Certificate Approvals',
        SelectMyCerts: SelectMyCerts,
        SelectAllCerts: SelectAllCerts,
        DefaultMyCert: DefaultMyCert,
        theOptionId: ko.observable(1),
        serverOptions: serverOptions,
        SortBy: SortBy
    };


    return vm;


    function SortUpDownAllCerts() {
        return allCertificates.sort()
    }

    function SortUpDownMyCerts() {
        return allCertificates.sort()
    }

    //*****WHAT CODE GOES HERE?
    function SortBy() {
        if (serverOptions[$('#ddlSortBy').val()] != undefined) {

        }
    }

    function DefaultMyCert() {
        return $('#btnMyCert').toggle('show');
    }

    function SelectAllCerts() {
        return CertificateDataService.getallCertificates(allCertificates);
    }

    function SelectMyCerts() {
        return CertificateDataService.getallCertificates(myCertificates);
    }
});

SortBy 関数コードはどうあるべきですか?


編集:

進捗状況 (ありがとう、ダミアン!) ですが、もう少し情報が必要です。serverSelectedOptionID でサブスクライブしており、関数 (a, b) のデータと、sortCriteriaID の正しい値を確認できます。私が欠けているのは、sortCriteriaID を使用してソートする列を指定する方法です。これが新しいコードです-

       serverSelectedOptionID.subscribe(function () {
        var sortCriteriaID = serverSelectedOptionID._latestValue;
        allCertificates.sort(function (a, b) {
            if (a[sortCriteriaID] == b[sortCriteriaID]) {
                return a[sortCriteriaID] > b[sortCriteriaID] ? 1 : a[sortCriteriaID] < b[sortCriteriaID] ? -1 : 0;
            }

            return a[sortCriteriaID] > b[sortCriteriaID] ? 1 : -1;

        });
    });

allCertificates 配列のモデルは次のとおりです。

     function (logger, system) {
    var certificateModel = function (clientID, lwCertID, requestDate, userName, statusDescription, statusCode, statusDesc, ceoUserName, clientName, clientNumber, borrowBaseCount, advRequestCount) {
        var self = this;
        self.clientID = ko.observable(clientID);
        self.lwCertID = ko.observable(lwCertID);
        self.requestDate = ko.observable(requestDate);
        self.userName = ko.observable(userName);
        self.statusDescription = ko.observable(statusDescription);
        self.statusCode = ko.observable(statusCode);
        self.statusDesc = ko.observable(statusDesc);
        self.ceoUserName = ko.observable(ceoUserName);
        self.clientName = ko.observable(clientName);
        self.clientNumber = ko.observable(clientNumber);
        self.borrowBaseCount = ko.observable(borrowBaseCount);
        self.advRequestCount = ko.observable(advRequestCount);
    };

もちろん、[sortCriteriaID] は機能しません。列の 1 つは lwCertID です。lwCertID がオプション 1 (sortCriteriaID = 1) である場合、sortCriteriaID を使用して a.lwCertID を表すコードは何でしょうか?

修正されたコード編集 (これは最後の部分であり、動作します)-

        serverSelectedOptionID.subscribe(function () {
        var sortCriteriaID = serverSelectedOptionID._latestValue;
        allCertificates.sort(function (a, b) {
            var fieldname = serverOptions[sortCriteriaID-1].OptionText;

            if (a[fieldname] == b[fieldname]) {
                return a[fieldname] > b[fieldname] ? 1 : a[fieldname] < b[fieldname] ? -1 : 0;
            }

            return a[fieldname] > b[fieldname] ? 1 : -1;

        });
    });
4

1 に答える 1