0

ViewModel には、ビューで管理されている配列を返す observableArray と計算済みがあります。

var operators = ko.observableArray([]);
    var records = ko.computed(function () {
        return operators();
    });

これが私のソート方法です。

Order = function (data, event, colName) {
            var th = $('#th-' + colName),
                attr = th.data('sort');

            setAttribute(th, attr); //switch data-sort between 'asc' and 'desc'

            if (attr === 'asc') {
                operators = operators.sort(function (a, b) {
                    return (a.fullname === b.fullname) ? 0 : (a.fullname < b.fullname ? -1 : 1);
                });
            }
            else {
                operators = operators.sort(function (a, b) {
                    return (a.fullname === b.fullname) ? 0 : (a.fullname > b.fullname ? -1 : 1);
                });
            }
        };

そして、これはビューです:

<table id="table-hour">
    <thead>
        <tr>
            <th data-bind="click: function(data, event) { Order(data, event, 'fullname')}" data-sort="asc" id="th-fullname">Fullname</th>
        </tr>
    </thead>
    <tbody>
        <!-- ko foreach: records -->
        <tr>
            <td>
                <span data-bind="text: fullname"></span>
            </td>
        </tr>    
        <!-- /ko -->
    </tbody>

まあ、並べ替え機能は魅力のように機能します。実際、ブラウザでデバッグすると、配列が両方の方法で並べ替えられていることがわかりますが、ビューは初めて更新されます。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

問題は、observableArray を更新し、データをその配列に戻す必要があることです。

オブザーバブルが更新されない場合、ビューは更新されません

JavaScript の並べ替え機能 ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort ) をご覧ください。

于 2012-11-22T09:37:10.687 に答える