【问题标题】:Angular filter with typescript is not working after minification带有打字稿的角度过滤器在缩小后不起作用
【发布时间】:2016-02-29 04:12:13
【问题描述】:

我用打字稿写了一个角度过滤器,在我缩小源代码之前效果很好。

这是过滤器:

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:unpr] 未知提供者:eProvider

非常感谢

【问题讨论】:

    标签: javascript angularjs typescript minify angularjs-filter


    【解决方案1】:

    缩小时不起作用的原因是您将"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 数组。

    【讨论】:

    • 非常感谢@hansmaad!我的实际过滤器要复杂一些。我也使用方法。我想继续上课。
    • @stevo 你能编辑你的问题并展示你想如何使用过滤器的方法吗?
    • 我用我的实际过滤器编辑了这个问题。再次感谢!
    • @stevo 您的示例中只有静态函数。上课没有理由。但我在答案中添加了一种使用该类的方法。
    猜你喜欢
    • 2015-06-23
    • 2016-03-08
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2022-09-23
    • 2016-01-20
    相关资源
    最近更新 更多