如何以编程方式更新ui-grid中的排序指标?

时间:2015-09-18 11:05:53

标签: angularjs angular-ui-grid

我正在使用ui-grid - v3.0.0-rc.22 - 2015-06-15。

它配置为使用外部排序,工作正常。

现在我需要使用选择框从外部更改已排序的列。在选择框的每次更改时,它都会触发外部排序,并且网格中的数据会正确更新。它还会更新gridOptions.columnDefs:它将除正确的列之外的所有列的排序对象设置为undefined并更新已排序的列。

但是有一个问题,当前排序的列指示符(在列标题中)没有按原样更新。

我尝试使用gridApi.core.notifyDataChange()和" options"或"柱"作为参数值,但它也没有工作。 如何以编程方式更新ui-grid中的排序指标?

以下是选择框触发的代码的一部分:

    function updateSortColumn() {
        if ($rootScope.QuickSearch.sortBy !== undefined) {
            $scope.gridOptions.columnDefs.forEach(function (col) {
                if (col.field === $rootScope.QuickSearch.sortBy) {
                    col.sort = {
                        direction:  $rootScope.QuickSearch.sortOrder,
                        priority: 0
                    };
                }
                else
                {
                    col.sort = undefined;
                }
            });
        }
        if($scope.gridApi !== undefined)
        {
            $scope.gridApi.core.notifyDataChange( uiGridConstants.dataChange.OPTIONS );
            $scope.gridApi.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );
        }
    }

2 个答案:

答案 0 :(得分:5)

您可以使用ui-grid的“sortColumn”函数,如下所示:

$scope.gridApi.grid.sortColumn(column, directionOrAdd, add)

这是此函数的源代码:ui-grid source code

在你的例子中,它会给出这样的东西:

 function updateSortColumn() {
        if ($rootScope.QuickSearch.sortBy !== undefined) {
            $scope.gridOptions.columnDefs.forEach(function (col) {
                if (col.field === $rootScope.QuickSearch.sortBy) {
                    $scope.gridApi.grid.sortColumn(col,$rootScope.QuickSearch.sortOrder);
                }
            });
        }
    }

$ rootScope.QuickSearch.sortOrder必须在(uiGridConstants.ASC | uiGridConstants.DESC)中。您无需提供它。

答案 1 :(得分:1)

我遇到了同样的问题 - 在我的案例中,解决方案是Gho5t在关于这个问题的另一个答案的评论中提到的。

我添加了此响应,因此解决方案可以提供更多可见性(以及更完整的代码示例)。

我需要一种方法来挂钩网格上的排序事件,并通过同一列对页面上的其他网格进行排序(它们都具有相同的列定义)。

我错误地将gridOptions.colDefinition对象传递给sortColumn()方法,并且列标题排序指示符未更新。

grid.column对象是sortColumn()方法所寻求的对象,并使事情按预期工作。

// sortColumns is an array of column objects that gets passed in when a grid column is sorted (this code only considers the first sorted column)
// secondGridObj is an object defined elsewhere that has a reference to another grid's gridApi object

gridApi.core.on.sortChanged(null, function (grid, sortColumns) {
    if (sortColumns.length) {
        var sortDirection = (sortColumns[0].sort) ? sortColumns[0].sort.direction || uiGridConstants.ASC : uiGridConstants.ASC;
        var matchingColumn = _.find(secondGridObj.gridApi.grid.columns, function (v2) { return v2.field === sortColumns[0].field; });

        if (matchingColumn) {
            secondGridObj.gridApi.grid.sortColumn(matchingColumn, sortDirection, false)
           .then(function() {
               secondGridObj.gridApi.grid.notifyDataChange(uiGridConstants.dataChange.COLUMN);
           });
        }
    }
});