第三次单击时按升序/降序重置列排序

发布于 2024-11-23 23:50:20 字数 133 浏览 1 评论 0原文

假设我们有一个带有可排序列的网格。

如果用户单击某列,它将按“asc”排序,然后如果用户再次单击列标题,它将按“desc”排序,现在当用户第三次单击该列时,我想要类似的功能,排序被删除,即返回到以前的样式,CSS 更改回正常/非斜体等?

Suppose we've a grid with sortable columns.

If a user clicks on a column, it gets sorted by 'asc', then if a user clicks the column header again, it gets sorted by 'desc', now I want similar functionality when a user clicks the column third time, the sorting is removed, i.e. returned to previous style, the css is changed back to normal/non-italic etc?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜妞爱困 2024-11-30 23:50:20

今天我试图实现同样的目标。我浏览了 SlickGrid 代码,但没有找到任何“重置”功能。因此,我对 slick.grid.js v2.2 进行了一些调整。

基本上,您只需要添加一个新数组 - “latestSortColumns”,它将存储排序列状态(内部 SlickGrid sortColumns 数组的深层副本)。

var latestSortColumns = [];

(可选)添加新设置以选择加入排序重置。

var defaults = {
  (...),
  autoResetColumnSort: false
};

更改 setupColumnSort 以在第三次单击列标题后重置排序。

function setupColumnSort() {
  $headers.click(function (e) {
    // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)
    e.metaKey = e.metaKey || e.ctrlKey;

    if ($(e.target).hasClass("slick-resizable-handle")) {
      return;
    }

    var $col = $(e.target).closest(".slick-header-column");
    if (!$col.length) {
      return;
    }

    var column = $col.data("column");
    if (column.sortable) {
      if (!getEditorLock().commitCurrentEdit()) {
        return;
      }

      var sortOpts = null;
      var i = 0;
      for (; i < sortColumns.length; i++) {
        if (sortColumns[i].columnId == column.id) {
          sortOpts = sortColumns[i];
          sortOpts.sortAsc = !sortOpts.sortAsc;
          break;
        }
      }

      **if ((e.metaKey || (options.autoResetColumnSort && latestSortColumns[i] != null && latestSortColumns[i].sortAsc === !column.defaultSortAsc)) && options.multiColumnSort) {**
        if (sortOpts) {
            sortColumns.splice(i, 1);
            **latestSortColumns.splice(i, 1);**
        }
      }
      else {
        if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {
          sortColumns = [];
        }

        if (!sortOpts) {
          sortOpts = { columnId: column.id, sortAsc: column.defaultSortAsc };
          sortColumns.push(sortOpts);
        } else if (sortColumns.length == 0) {
          sortColumns.push(sortOpts);
        }
      }

      setSortColumns(sortColumns);

      if (!options.multiColumnSort) {
        trigger(self.onSort, {
          multiColumnSort: false,
          sortCol: column,
          sortAsc: sortOpts.sortAsc}, e);
      } else {
        trigger(self.onSort, {
          multiColumnSort: true,
          sortCols: $.map(sortColumns, function(col) {
            return {sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };
          })}, e);
      }
    }
  });
}

在latestSortColumns中每次排序更改后存储新状态:

function setSortColumns(cols) {
  sortColumns = cols;

  var headerColumnEls = $headers.children();
  headerColumnEls
      .removeClass("slick-header-column-sorted")
      .find(".slick-sort-indicator")
          .removeClass("slick-sort-indicator-asc slick-sort-indicator-desc");

  $.each(sortColumns, function(i, col) {
    if (col.sortAsc == null) {
      col.sortAsc = true;
    }
    var columnIndex = getColumnIndex(col.columnId);
    if (columnIndex != null) {
      headerColumnEls.eq(columnIndex)
          .addClass("slick-header-column-sorted")
          .find(".slick-sort-indicator")
              .addClass(col.sortAsc ? "slick-sort-indicator-asc" : "slick-sort-indicator-desc");
    }
  });

  **for (var i = 0; i < sortColumns.length; i++)
      latestSortColumns[i] = { columnId: sortColumns[i].columnId, sortAsc: sortColumns[i].sortAsc };**
}

就是这样,现在应该可以工作了。

Today I was trying to achieve same thing. I've skimmed through SlickGrid code but didn't find any 'Reset' function. So, I've tweaked the slick.grid.js v2.2 a little bit.

Basically you just need to add a new array - 'latestSortColumns' which will store sort columns state (deep copy of internal SlickGrid sortColumns array).

var latestSortColumns = [];

Optionally add new setting to opt-in for sort reset.

var defaults = {
  (...),
  autoResetColumnSort: false
};

Change setupColumnSort to reset sort after third click on column's header.

function setupColumnSort() {
  $headers.click(function (e) {
    // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)
    e.metaKey = e.metaKey || e.ctrlKey;

    if ($(e.target).hasClass("slick-resizable-handle")) {
      return;
    }

    var $col = $(e.target).closest(".slick-header-column");
    if (!$col.length) {
      return;
    }

    var column = $col.data("column");
    if (column.sortable) {
      if (!getEditorLock().commitCurrentEdit()) {
        return;
      }

      var sortOpts = null;
      var i = 0;
      for (; i < sortColumns.length; i++) {
        if (sortColumns[i].columnId == column.id) {
          sortOpts = sortColumns[i];
          sortOpts.sortAsc = !sortOpts.sortAsc;
          break;
        }
      }

      **if ((e.metaKey || (options.autoResetColumnSort && latestSortColumns[i] != null && latestSortColumns[i].sortAsc === !column.defaultSortAsc)) && options.multiColumnSort) {**
        if (sortOpts) {
            sortColumns.splice(i, 1);
            **latestSortColumns.splice(i, 1);**
        }
      }
      else {
        if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {
          sortColumns = [];
        }

        if (!sortOpts) {
          sortOpts = { columnId: column.id, sortAsc: column.defaultSortAsc };
          sortColumns.push(sortOpts);
        } else if (sortColumns.length == 0) {
          sortColumns.push(sortOpts);
        }
      }

      setSortColumns(sortColumns);

      if (!options.multiColumnSort) {
        trigger(self.onSort, {
          multiColumnSort: false,
          sortCol: column,
          sortAsc: sortOpts.sortAsc}, e);
      } else {
        trigger(self.onSort, {
          multiColumnSort: true,
          sortCols: $.map(sortColumns, function(col) {
            return {sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };
          })}, e);
      }
    }
  });
}

Store new state after every sort change in latestSortColumns:

function setSortColumns(cols) {
  sortColumns = cols;

  var headerColumnEls = $headers.children();
  headerColumnEls
      .removeClass("slick-header-column-sorted")
      .find(".slick-sort-indicator")
          .removeClass("slick-sort-indicator-asc slick-sort-indicator-desc");

  $.each(sortColumns, function(i, col) {
    if (col.sortAsc == null) {
      col.sortAsc = true;
    }
    var columnIndex = getColumnIndex(col.columnId);
    if (columnIndex != null) {
      headerColumnEls.eq(columnIndex)
          .addClass("slick-header-column-sorted")
          .find(".slick-sort-indicator")
              .addClass(col.sortAsc ? "slick-sort-indicator-asc" : "slick-sort-indicator-desc");
    }
  });

  **for (var i = 0; i < sortColumns.length; i++)
      latestSortColumns[i] = { columnId: sortColumns[i].columnId, sortAsc: sortColumns[i].sortAsc };**
}

That's all, should work now.

妳是的陽光 2024-11-30 23:50:20

我调用此函数将所有列重置回原始顺序。

它要求将其中一列设置为不可排序。
在下面的示例中,我使用表的第一列 columns[0],其字段 ID 为“locus”。

function removeSorting() {
  columns[0].sortable = true;
  $('.slick-header-columns').children().eq(0).trigger('click');
  columns[0].sortable = false;
  // clear other sort columns
  grid.setSortColumns( new Array() );
}

然后在典型的 dataView.sort() 函数中,您对此列进行例外处理:

grid.onSort.subscribe(function(e,args) {
  var cols = args.sortCols;
  dataView.sort(function (dataRow1, dataRow2) {
    for( var i = 0; i < cols.length; i++ ) {
      var field = cols[i].sortCol.field;
      // reset sorting to original indexing
      if( field === 'locus' ) {
        return (dataRow1.id > dataRow2.id) ? 1 : -1;
      }
      var value1 = dataRow1[field];
      var value2 = dataRow2[field];
      if( value1 == value2 ) continue;
      var sign = cols[i].sortAsc ? 1 : -1;
      return (value1 > value2) ? sign : -sign;
    }
    return 0;
  });
});

This is a function I call to reset all columns back to their original order.

It requires one of columns to be set up as not sortable.
In the example below I use the first column of the table, columns[0], which has the field id "locus".

function removeSorting() {
  columns[0].sortable = true;
  $('.slick-header-columns').children().eq(0).trigger('click');
  columns[0].sortable = false;
  // clear other sort columns
  grid.setSortColumns( new Array() );
}

Then in the typical dataView.sort() function you make an exception for this column:

grid.onSort.subscribe(function(e,args) {
  var cols = args.sortCols;
  dataView.sort(function (dataRow1, dataRow2) {
    for( var i = 0; i < cols.length; i++ ) {
      var field = cols[i].sortCol.field;
      // reset sorting to original indexing
      if( field === 'locus' ) {
        return (dataRow1.id > dataRow2.id) ? 1 : -1;
      }
      var value1 = dataRow1[field];
      var value2 = dataRow2[field];
      if( value1 == value2 ) continue;
      var sign = cols[i].sortAsc ? 1 : -1;
      return (value1 > value2) ? sign : -sign;
    }
    return 0;
  });
});
筱武穆 2024-11-30 23:50:20

表是否总是在某些列上按某种顺序排序?

如果没有,那么您必须在第一次单击列时存储大量状态,以防您想在第三次单击后恢复它。

Will the table always be sorted in some order on some column?

If not then you'll have to store a lot of state the first time a column is clicked just in case you want to restore it after a third click.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文