【问题标题】:AngularJS Custom Filter in ng-repeat Tableng-repeat 表中的 AngularJS 自定义过滤器
【发布时间】:2020-06-18 16:46:14
【问题描述】:

我可以使用此自定义过滤器过滤表(特定列)中的值。数据来自多选输入数组

完整示例: http://jsfiddle.net/d1sLj05t/1/

myApp.filter('filterMultiple',['$filter',function ($filter) {
    return function (items, keyObj) {
        var filterObj = {
            data:items,
            filteredData:[],
            applyFilter : function(obj,key){
                var fData = [];
                if(this.filteredData.length == 0)
                    this.filteredData = this.data;
                if(obj){
                    var fObj = {};
                    if(angular.isString(obj)){
                        fObj[key] = obj;
                        fData = fData.concat($filter('filter')(this.filteredData,fObj));
                    }else if(angular.isArray(obj)){
                        if(obj.length > 0){ 
                            for(var i=0;i<obj.length;i++){
                                if(angular.isString(obj[i])){
                                    fObj[key] = obj[i];
                                    fData = fData.concat($filter('filter')(this.filteredData,fObj));    
                                }
                            }           
                        }                                       
                    }                                   
                    if(fData.length > 0){
                        this.filteredData = fData;
                    }
                }
            }
        };

        if(keyObj){
            angular.forEach(keyObj,function(obj,key){
                filterObj.applyFilter(obj,key);
            });         
        }               
        return filterObj.filteredData;
    } 
}]);
<tr ng-repeat="emp in empList | filterMultiple:{dept:selected}">    

当值存在时完美,例如“sales”或“account”,但是当表中不存在该值时,返回所有数据(当我选择“not”或组合“not”和“sales”时)。我希望只有选定值的结果为空

【问题讨论】:

    标签: javascript angularjs angularjs-ng-repeat angularjs-filter


    【解决方案1】:

    我认为你可以用一个更简单的过滤器来完成你想要的。您可能想尝试这样的事情:

    myApp.filter('filterMultiple',['$filter',function ($filter) {
        return function (items, keyObj) {
            //If the value isn't defined, don't filter at all.
            if (keyObj.value == undefined) {
                return items;
            }
            //Use javascript's native Array.filter() to get only the items that match.
            return items.filter(function(item) {
                //Keep any items whose specified attribute includes the selected value
                return item[keyObj.column].includes(keyObj.value);
            })
        }
    }]);
    

    并且您的 HTML 略有变化:

    <tr ng-repeat="emp in empList | filterMultiple:{column:'dept', value:selected}"> 
    

    我不确定您所说的“结合 'not' 和 'sales'”是什么意思,但我认为这会让您朝着正确的方向前进。

    以下是一些相关链接,以防你不熟悉我在代码中所做的一些事情:

    Documentation for Array.filter -- MDN

    Array.filter is better than $filter('filter') -- StackOverflow

    Documentation for String.includes -- MDN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多