缩小后,具有typescript的角度筛选器无法工作

Angular filter with typescript is not working after minification

本文关键字:筛选 工作 具有 typescript 缩小      更新时间:2023-09-26

我用typescript写了一个角度过滤器,它在缩小源代码之前一直很好。

这是过滤器:

module App.Test {
    export interface IGroupingFilter extends ng.IFilterService {
        (name:"grouping-filter"): (collection:any[]) => collection:any[];
    }
    class GroupingFilter {
        static $inject:string[] = ["underscore"];
        static ConvertDateTime(item:any):number {
            var time = "" + item.time;
            var newTime = (time.length == 3) ? "0" + time : time;
            return +(item.pickupDate.replace(/'-/g, '') + newTime);
        }
        public static Factory(underscore:UnderscoreStatic) {
            return underscore.memoize((collection:any[]) => {
                var groupKey = "id";
                var group:any = underscore.groupBy(collection, (item:any) => {
                    return item[groupKey];
                });
                var grpArray = [];
                angular.forEach(group, (item) => {
                    grpArray.push({
                        "groupKey": item[0][groupKey],
                        "items": item
                    });
                });
                var grpArraySorted = underscore.sortBy(grpArray, (grpObj:any) => {
                    var min:any = underscore.min(grpObj.items, (item:any) => {
                        return GroupingFilter.ConvertDateTime(item);
                    });
                    return GroupingFilter.ConvertDateTime(min);
                });
                return grpArraySorted;
            });
        }
    }
    angular.module("app").filter("groupingFilter", GroupingFilter.Factory);
}

这是缩小版:

var App;
!function (t) {
    var e;
    !function (t) {
        var e = function () {
            function t() {
            }
            return t.ConvertDateTime = function (t) {
                var e = "" + t.time, r = 3 == e.length ? "0" + e : e;
                return +(t.pickupDate.replace(/'-/g, "") + r)
            }, t.Factory = function (e) {
                return e.memoize(function (r) {
                    var n = "id", i = e.groupBy(r, function (t) {
                        return t[n]
                    }), o = [];
                    angular.forEach(i, function (t) {
                        o.push({groupKey: t[0][n], items: t})
                    });
                    var a = e.sortBy(o, function (r) {
                        var n = e.min(r.items, function (e) {
                            return t.ConvertDateTime(e)
                        });
                        return t.ConvertDateTime(n)
                    });
                    return a
                })
            }, t.$inject = ["underscore"], t
        }();
        angular.module("app").filter("groupingFilter", e.Factory)
    }(e = t.Test || (t.Test = {}))
}(App || (App = {}));

这是角度错误消息

错误:[$injector:unp]未知提供程序:eProvider<-e&lt-分组过滤器过滤器

非常感谢

缩小时它不起作用的原因是将"underscore"注入FooFilter类,而不是实际的筛选器,这是FooFilter.Factory的结果。要创建这样一个简单的过滤器,您实际上并不需要类,只需传递一个简单函数即可。

angular.module('app').filter('fooFilter', fooFilter);
fooFilter.$inject = ['underscore'];
function fooFilter(underscore) {
    return underscore.memoize((collection:any[]) => {
        return underscore.shuffle(collection);
    });
}

如果你真的想把过滤器工厂函数写成一个静态类方法,你可以使用这样的数组语法:

 angular.module("app")
   .filter("groupingFilter", ['underscore', GroupingFilter.Factory]);

在这种情况下,请从类中删除$inject数组。