0

我正在研究淘汰赛绑定..我有淘汰赛排序来实现,我已经这样做了..

function notesViewModel() {
    _this.colName = "CreatedDate";
    _this.sortOrder = "desc";
    _this.notes = ko.observableArray();

   _this.SortItems = function (colname) {
        var newNotes = _this.notes();
        if (_this.sortOrder === "desc") {
            this.notes(newNotes.sort(notesViewModel._getSortFunction = function (a, b) {
                return a[colname] < b[colname] ? -1 : 1;
            }));
            switchSortOrder();
        } else {
            this.notes(newNotes.sort(notesViewModel._getSortFunction = function (a, b) {
                return a[colname] > b[colname] ? -1 : 1;
            }));
            switchSortOrder();
        }
    };
    function switchSortOrder() {
        if (_this.sortOrder === "asc") {
            _this.sortOrder = "desc";
        } else {
            _this.sortOrder = "asc";
        }
    }
 ko.applyBindings(_this, $("body").get(0));
return _this;
}

我的html代码是这样的:

<table id="notes" class="notes_table">
        <tr class="head">
        <th data-bind='click: function() { SortItems("CreatedDate")}'>
        <span>Date</span>
        </th>
        <th data-bind='click: function() { SortItems("Type")}'>
        <span>Type</span>
        </th>
        <th data-bind='click: function() { SortItems("Category")}'>
        <span>Category</span>
        </th>
        <th data-bind='click: function() {SortItems("AddedBy")}'>
        <span>Added by</span>
        </th>
        <th>
        <span>Alerts</span>
        </th>
        <th></th>
        </tr>
        <tbody data-bind="template: { name: 'StudentNote', foreach: notes }"></tbody>
    </table>

我想将排序功能重构为这样的东西..

_

this.SortItems = function (colname) {
        var newNotes = _this.notes();
        this.notes(newNotes.sort(notesViewModel._getSortFunction = compareFunction (a, b,_this.sortOrder)));

  function comparerFunction(a,b,sortOrder)
 {
     if(sortOrder === "desc")
    {

     return a[colname] < b[colname] ? -1 : 1;
     _this.sortOrder = "asc";

    }
    else
    {
     return a[colname] > b[colname] ? -1 : 1;
     _this.sortOrder = "desc";
    }
 }

};

但它没有成功,因为它说 a 和 b 参数不可用.. 谁能告诉我如何将逻辑与匿名函数分离

4

1 回答 1

1

看起来您对匿名函数是什么感到有些困惑。

什么(我认为)你想要做的是有一个单一的功能,可用于根据“this”的“sortOrder”字段进行升序和降序排序。

您的代码有几个问题:

  • 首先,您调用的是函数而不是将其保存到 this.sortOrder。这就是为什么 'a' 和 'b' 不可用的原因,这个函数只能由排序算法调用。
  • 其次,“this”不会指向比较函数中的正确位置:要在 Javascript 中定义“this”对象,您需要将函数存储在对象(或原型)上,或者使用特殊的调用语义。'this' 在 Javascript 中很棘手,值得(重新)阅读一些教程以确保您理解它。
  • 最后,在定义它之前调用 compareFunction。

此代码符合您的要求,尽管我尚未对其进行测试,也不知道您正在使用的框架。它在调用 sort 之前将 sortOrder 存储在外部函数中,以便内部函数可以使用它。

this.SortItems = function (colname) {
  var sortOrder = this.sortOrder; // make sortOrder available to the sort function
  this.notes(_this.notes().sort(
    function (a, b) {
      return ((sortOrder === "desc") ? 1 : -1) * ((a[colname] < b[colname]) ? -1 : 1);
    }));
}; 
于 2013-04-26T07:32:18.487 回答