1

我正在使用 ag-Grid,但是当它过滤我的数据时出现问题,当我在价格列中过滤我的数据时,它只适用于数字点而不是逗号。

Link: https://plnkr.co/edit/LDdrRbANSalvb4Iwh5mp?p=preview

实际示例:在价格列选择框等于及以上插入“1.5”,然后尝试插入“1,5”

4

3 回答 3

1

这是因为此过滤器是原生过滤器。

如果您想处理自定义行为,请定义您自己的过滤器。

文档: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(',','.'));
于 2016-03-03T09:55:27.653 回答
0

所以我发现了问题,首先我必须转换值有一个字符串,而不是用逗号替换点,上面答案的问题首先是因为数据类型而不是替换属性的顺序功能,但现在的问题是过滤不正确,如果我使用相等选项搜索,如果给我 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;
            }  
};
于 2016-03-03T15:01:14.263 回答
0

可能的解决方案:

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();
        }
    };
于 2016-03-03T16:21:19.003 回答