ui 使用 cellTemplate 时网格过滤器和排序不起作用
ui grid Filter and sorting not working when cellTemplate used
我正在使用 ui.grid
,其中某些列填充有 cellTemplate
。它正确填充了值,但排序和过滤不起作用。我需要对 sorting/filtering 逻辑做任何事情吗?
问题已在 Plnkr http://plnkr.co/edit/JscrG3EJiTlnVa0t9DjH 重新创建,Age 和 Balance 列的排序和过滤均无效。
this.grdColDefs = [
{
name: 'Age',
width: 90,
cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.calcAge(row.entity)}}</div>',
headerCellClass: 'my-cell-header',
}
];
问题在于为单元格模板制作数据
我将与您分享两支代码笔,一支有工作过滤器,一支没有工作过滤器,并将尝试解释为什么在一个地方工作和为什么在其他地方不工作的区别
当我们按照您的情况制作这样的单元格模板时
cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.calcAge(row.entity)}}</div>',
在这种情况下,过滤器将不起作用,因为网格中显示的内容与 row.entity
中实际显示的内容不同
看看你的问题陈述,我模拟了一个过滤器不起作用的示例网格
http://codepen.io/vkvicky-vasudev/pen/zKmVVO
如果我们想让我们的网格使用这个实现仍然过滤器应该工作,那么我们可以像这样更改过滤器逻辑
$scope.singleFilter = function( renderableRows ){
var matcher = new RegExp($scope.filterValue);
renderableRows.forEach( function( row ) {
var match = false;
['name','age'].forEach(function( field ){
if ( row.entity[field].match(matcher) ){
match = true;
}
if(field =='age'){
//this is new if block to handle the case for filtering not working
var currData =$scope.calcAge(row.entity)
if (currData.match(matcher) ){
match = true;
}
}
});
if ( !match ){
row.visible = false;
}
});
return renderableRows;
};
解决这个问题
我所做的是你想要在网格中显示的任何内容,相同的数据应该出现在你的 gridOptions.data 数组中,所以在构建网格之前,根据你的需要制作 gridOptions.data 这里是过滤器正在工作的工作演示
http://codepen.io/vkvicky-vasudev/pen/rrqgzy
现在请观察两种情况的区别
新的单元格模板是这个
cellTemplate: '<div class="ui-grid-cell-contents">{{row.entity.age}}</div>',
headerCellClass: 'my-cell-header'
在这种情况下,网格中可见的内容与我们在 gridOptions.data
中的数据相同
我试图理解您的问题并以最好的方式解释它,即使您有任何问题也可以随时提出,我已经对自定义过滤器进行了类似的更改,我们可以进行自定义排序
当我使用 field
指向模型时问题已解决。
我正在使用 ui.grid
,其中某些列填充有 cellTemplate
。它正确填充了值,但排序和过滤不起作用。我需要对 sorting/filtering 逻辑做任何事情吗?
问题已在 Plnkr http://plnkr.co/edit/JscrG3EJiTlnVa0t9DjH 重新创建,Age 和 Balance 列的排序和过滤均无效。
this.grdColDefs = [
{
name: 'Age',
width: 90,
cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.calcAge(row.entity)}}</div>',
headerCellClass: 'my-cell-header',
}
];
问题在于为单元格模板制作数据 我将与您分享两支代码笔,一支有工作过滤器,一支没有工作过滤器,并将尝试解释为什么在一个地方工作和为什么在其他地方不工作的区别
当我们按照您的情况制作这样的单元格模板时
cellTemplate: '<div class="ui-grid-cell-contents">{{grid.appScope.calcAge(row.entity)}}</div>',
在这种情况下,过滤器将不起作用,因为网格中显示的内容与 row.entity
中实际显示的内容不同看看你的问题陈述,我模拟了一个过滤器不起作用的示例网格 http://codepen.io/vkvicky-vasudev/pen/zKmVVO
如果我们想让我们的网格使用这个实现仍然过滤器应该工作,那么我们可以像这样更改过滤器逻辑
$scope.singleFilter = function( renderableRows ){
var matcher = new RegExp($scope.filterValue);
renderableRows.forEach( function( row ) {
var match = false;
['name','age'].forEach(function( field ){
if ( row.entity[field].match(matcher) ){
match = true;
}
if(field =='age'){
//this is new if block to handle the case for filtering not working
var currData =$scope.calcAge(row.entity)
if (currData.match(matcher) ){
match = true;
}
}
});
if ( !match ){
row.visible = false;
}
});
return renderableRows;
};
解决这个问题
我所做的是你想要在网格中显示的任何内容,相同的数据应该出现在你的 gridOptions.data 数组中,所以在构建网格之前,根据你的需要制作 gridOptions.data 这里是过滤器正在工作的工作演示 http://codepen.io/vkvicky-vasudev/pen/rrqgzy
现在请观察两种情况的区别
新的单元格模板是这个
cellTemplate: '<div class="ui-grid-cell-contents">{{row.entity.age}}</div>',
headerCellClass: 'my-cell-header'
在这种情况下,网格中可见的内容与我们在 gridOptions.data
中的数据相同我试图理解您的问题并以最好的方式解释它,即使您有任何问题也可以随时提出,我已经对自定义过滤器进行了类似的更改,我们可以进行自定义排序
当我使用 field
指向模型时问题已解决。