我正在使用 ag-Grid,但是当它过滤我的数据时出现问题,当我在价格列中过滤我的数据时,它只适用于数字点而不是逗号。
Link: https://plnkr.co/edit/LDdrRbANSalvb4Iwh5mp?p=preview
实际示例:在价格列选择框等于及以上插入“1.5”,然后尝试插入“1,5”
这是因为此过滤器是原生过滤器。
如果您想处理自定义行为,请定义您自己的过滤器。
文档:https ://www.ag-grid.com/angular-grid-filtering/index.php
一个快速而肮脏的解决方案是像这样对 NumberFilter 进行修补:
NumberFilter.prototype.doesFilterPass = function (node) {
if (this.filterNumber === null) {
return true;
}
var value = this.valueGetter(node);
if (!value && value !== 0) {
return false;
}
var valueAsNumber;
if (typeof value === 'number') {
valueAsNumber = value;
}
else {
valueAsNumber = parseFloat(value.replace(',','.'));
}
switch (this.filterType) {
case EQUALS:
return valueAsNumber === this.filterNumber;
case LESS_THAN:
return valueAsNumber < this.filterNumber;
case GREATER_THAN:
return valueAsNumber > this.filterNumber;
default:
// should never happen
console.warn('invalid filter type ' + this.filterType);
return false;
}
};
然后更改的行在这里:
valueAsNumber = parseFloat(value.replace(',','.'));
所以我发现了问题,首先我必须转换值有一个字符串,而不是用逗号替换点,上面答案的问题首先是因为数据类型而不是替换属性的顺序功能,但现在的问题是过滤不正确,如果我使用相等选项搜索,如果给我 2 个值,而不是一个固定值,代码看起来像这样:
代码:
NumberFilter.prototype.doesFilterPass = function (node) {
if (this.filterNumber === null) {
return true;
}
var value = this.valueGetter(node);
if (!value && value !== 0) {
return false;
}
var valueAsNumber;
if (typeof value === 'number') {
value = value.toString()
valueAsNumber = parseFloat(value.replace('.',','));
}
else {
valueAsNumber = parseFloat(value.replace('.',','));
}
switch (this.filterType) {
case EQUALS:
return valueAsNumber === this.filterNumber;
case LESS_THAN:
return valueAsNumber < this.filterNumber;
case GREATER_THAN:
return valueAsNumber > this.filterNumber;
default:
// should never happen
console.warn('invalid filter type ' + this.filterType);
return false;
}
};
可能的解决方案:
NumberFilter.prototype.onFilterChanged = function () {
var filterText = utils_1.default.makeNull(this.eFilterTextField.value);
if (filterText && filterText.trim() === '') {
filterText = null;
}
var newFilter;
if (filterText !== null && filterText !== undefined) {
console.log(filterText);
// replace comma by dot
newFilter = parseFloat(filterText.replace(/,/g, '.'));
console.log(newFilter);
}
else {
newFilter = null;
}
if (this.filterNumber !== newFilter) {
this.filterNumber = newFilter;
this.filterChanged();
}
};