在 UI-Grid header 中实现 multi-column 分组有更好的方法吗?
Any better approaches in achieving multi-column grouping in UI-Grid header?
我尝试使用以下方法在 header 列级别为 UI-Grid 实现多列分组。
我遵循的步骤:
包含 UI 网格的以下 header 单元格模板,以及另一个 "UI Grid row":
<div class="ui-grid-header custom-ui-grid-header">
<div class="ui-grid-top-panel">
<div class="ui-grid-header-viewport">
<div class="ui-grid-header-canvas">
<div class="ui-grid-header-cell-wrapper" ng-style="colContainer.headerCellWrapperStyle()">
<div class="ui-grid-header-cell-row">
<div class="ui-grid-header-cell" ng-repeat="superCol in grid.options.superColDefs track by $index" col-name="{{superCol.name}}">
<div class="ui-grid-cell-contents" data-ng-bind="superCol.displayName">
</div>
</div>
</div>
<div class="ui-grid-header-cell-row">
<div class="ui-grid-header-cell ui-grid-clearfix" ng-repeat="col in colContainer.renderedColumns track by col.colDef.name" ui-grid-header-cell super-col-width-update col="col" render-index="$index">
</div>
</div>
</div>
</div>
</div>
<div ui-grid-menu></div>
</div>
</div>
添加对包含超级列数据的网格的列定义 object 的引用:
$scope.gridOptions = {
headerTemplate: 'views/header-template.html',
superColDefs: [{
name: 'group1',
displayName: 'Group 1'
}, {
name: 'group2',
displayName: 'Group 2'
}],
columnDefs: [{
name: 'name',
displayName: 'Name',
superCol: 'group1'
}, {
name: 'title',
displayName: 'Title',
superCol: 'group1'
}, {
name: 'age',
displayName: 'Age',
superCol: 'group2'
}],
data: [{
name: 'Bob',
title: 'CEO',
age: '31'
}, {
name: 'Frank',
title: 'Lowly Developer',
age: '33'
}]
};
计算每个 header 列的宽度,并将其添加到其超级列的宽度,使每个相关的超级单元格跨越其 child 单元格。这可以通过将放置在每个 child header 单元格上的指令来实现。
指令:
.directive('superColWidthUpdate', ['$timeout', function ($timeout) {
return {
'restrict': 'A',
'link': function (scope, element) {
var _colId = scope.col.colDef.superCol,
_el = jQuery(element);
_el.on('resize', function () {
_updateSuperColWidth();
});
var _updateSuperColWidth = function () {
$timeout(function () {
var _parentCol = jQuery('.ui-grid-header-cell[col-name="' + _colId + '"]');
var _parentWidth = _parentCol.outerWidth(),
_width = _el.outerWidth();
_parentWidth = ((_parentWidth === 1) ? 0 : _parentWidth) + _width + 'px';
_parentCol.css({
'min-width': _parentWidth,
'max-width': _parentWidth
});
}, 0);
};
_updateSuperColWidth();
}
};
}]);
在上述方法中,解决方案是通过操纵 DOM 呈现新的 header 行和新的 header 单元格来实现的,这些单元格位于通常的 header 行,但在 Header 视口内。
不过,我正在寻找更好的方法,可能是使用 UI-Grid 的内部服务或指令。非常感谢任何帮助!
网格目前不支持多列分组,障碍之一是与列移动和调整大小的交互。
话虽如此,我们很想拥有它,看看你所做的,我认为你可以帮助在 ui-grid 中编写该功能。
我不完全确定列分组如何与列移动一起使用 - 也许它总是会迫使整个组移动,而不仅仅是单个列。通过调整大小,组列的宽度基本上需要等于子列的总和。
这基本上就是您已经完成的工作,唯一的技巧是将其融入特征结构。
如果你想在某个时候加入 gitter 频道 https://gitter.im/angular-ui/ng-grid 你可能会发现人们会帮助你进行 PR(可能 @c0bra 最适合提供帮助)
有一个更简单的解决方案。编写一个 customTreeAggregationFn,它只计算您希望包含在分组行中的行的标识:
var customTreeAggregationFn = function(aggregation, fieldValue, value, row) {
// calculates the average of the squares of the values
if (typeof(aggregation.count) === 'undefined') {
aggregation.count = 0;
}
aggregation.count++;
aggregation.value = value;
}
然后使用这个函数过滤掉cellTemplate中的non-header行:
{
name: 'EDM Id',
displayName: 'EDM Id',
field: 'Entity__r.EDM_ID__c',
enableColumnMenu: false,
customTreeAggregationFinalizerFn: function(aggregation) {
aggregation.rendered = aggregation.value;
},
cellTemplate: '<div><div class="ui-grid-cell-contents" ng-if="row.groupHeader" title="TOOLTIP">{{COL_FIELD CUSTOM_FILTERS}}</div></div>',
customTreeAggregationFn: customTreeAggregationFn
}
我尝试使用以下方法在 header 列级别为 UI-Grid 实现多列分组。
我遵循的步骤:
包含 UI 网格的以下 header 单元格模板,以及另一个 "UI Grid row":
<div class="ui-grid-header custom-ui-grid-header"> <div class="ui-grid-top-panel"> <div class="ui-grid-header-viewport"> <div class="ui-grid-header-canvas"> <div class="ui-grid-header-cell-wrapper" ng-style="colContainer.headerCellWrapperStyle()"> <div class="ui-grid-header-cell-row"> <div class="ui-grid-header-cell" ng-repeat="superCol in grid.options.superColDefs track by $index" col-name="{{superCol.name}}"> <div class="ui-grid-cell-contents" data-ng-bind="superCol.displayName"> </div> </div> </div> <div class="ui-grid-header-cell-row"> <div class="ui-grid-header-cell ui-grid-clearfix" ng-repeat="col in colContainer.renderedColumns track by col.colDef.name" ui-grid-header-cell super-col-width-update col="col" render-index="$index"> </div> </div> </div> </div> </div> <div ui-grid-menu></div> </div> </div>
添加对包含超级列数据的网格的列定义 object 的引用:
$scope.gridOptions = { headerTemplate: 'views/header-template.html', superColDefs: [{ name: 'group1', displayName: 'Group 1' }, { name: 'group2', displayName: 'Group 2' }], columnDefs: [{ name: 'name', displayName: 'Name', superCol: 'group1' }, { name: 'title', displayName: 'Title', superCol: 'group1' }, { name: 'age', displayName: 'Age', superCol: 'group2' }], data: [{ name: 'Bob', title: 'CEO', age: '31' }, { name: 'Frank', title: 'Lowly Developer', age: '33' }] };
计算每个 header 列的宽度,并将其添加到其超级列的宽度,使每个相关的超级单元格跨越其 child 单元格。这可以通过将放置在每个 child header 单元格上的指令来实现。
指令:
.directive('superColWidthUpdate', ['$timeout', function ($timeout) {
return {
'restrict': 'A',
'link': function (scope, element) {
var _colId = scope.col.colDef.superCol,
_el = jQuery(element);
_el.on('resize', function () {
_updateSuperColWidth();
});
var _updateSuperColWidth = function () {
$timeout(function () {
var _parentCol = jQuery('.ui-grid-header-cell[col-name="' + _colId + '"]');
var _parentWidth = _parentCol.outerWidth(),
_width = _el.outerWidth();
_parentWidth = ((_parentWidth === 1) ? 0 : _parentWidth) + _width + 'px';
_parentCol.css({
'min-width': _parentWidth,
'max-width': _parentWidth
});
}, 0);
};
_updateSuperColWidth();
}
};
}]);
在上述方法中,解决方案是通过操纵 DOM 呈现新的 header 行和新的 header 单元格来实现的,这些单元格位于通常的 header 行,但在 Header 视口内。
不过,我正在寻找更好的方法,可能是使用 UI-Grid 的内部服务或指令。非常感谢任何帮助!
网格目前不支持多列分组,障碍之一是与列移动和调整大小的交互。
话虽如此,我们很想拥有它,看看你所做的,我认为你可以帮助在 ui-grid 中编写该功能。
我不完全确定列分组如何与列移动一起使用 - 也许它总是会迫使整个组移动,而不仅仅是单个列。通过调整大小,组列的宽度基本上需要等于子列的总和。
这基本上就是您已经完成的工作,唯一的技巧是将其融入特征结构。
如果你想在某个时候加入 gitter 频道 https://gitter.im/angular-ui/ng-grid 你可能会发现人们会帮助你进行 PR(可能 @c0bra 最适合提供帮助)
有一个更简单的解决方案。编写一个 customTreeAggregationFn,它只计算您希望包含在分组行中的行的标识:
var customTreeAggregationFn = function(aggregation, fieldValue, value, row) {
// calculates the average of the squares of the values
if (typeof(aggregation.count) === 'undefined') {
aggregation.count = 0;
}
aggregation.count++;
aggregation.value = value;
}
然后使用这个函数过滤掉cellTemplate中的non-header行:
{
name: 'EDM Id',
displayName: 'EDM Id',
field: 'Entity__r.EDM_ID__c',
enableColumnMenu: false,
customTreeAggregationFinalizerFn: function(aggregation) {
aggregation.rendered = aggregation.value;
},
cellTemplate: '<div><div class="ui-grid-cell-contents" ng-if="row.groupHeader" title="TOOLTIP">{{COL_FIELD CUSTOM_FILTERS}}</div></div>',
customTreeAggregationFn: customTreeAggregationFn
}