在AngularJS中动态注册过滤器?

时间:2015-02-15 18:16:54

标签: javascript angularjs

我正在学习AngularJS,我面临以下问题:动态地将过滤器注册到我的模块中。

我需要添加underscore.string的每个函数。这可能很无聊:

// js/filters/underscore.string.js
angular.module('util')
    .filter('numberFormat', ['_s', function (_s) {
        return _s.numberFormat
    }])
    // another filter, another filter, another filter, ...
    ;

_s是underscore.string服务)

可以这样做:

// js/filters/underscore.string.js
var util = angular.module('util');
angular.forEach(window.s, function (v, k) {
    if (angular.isFunction(v)) {
        util.filter(k, function (_s) {
            return _s[k];
        });
    }
});

但我使用全局s而非服务_s。感觉不对。

你认为这是一个坏主意吗?考虑一下我使用bower与x.y.* semver管理依赖关系,所以我应该基于" safe"就变化而言。

编辑:另一个有效的解决方案,但又感觉不好;服务提供商还注册其过滤器并使用全局window

angular.module('util')
    .provider('_s', ['$filterProvider', function ($filterProvider) {
        var s = window.s;
        angular.forEach(s, function (val, key) {
            if (angular.isFunction(val)) {
                $filterProvider.register(key, function () {
                    return s[key];
                });
            }
        });

        this.$get = ['$window', function ($window) {
            return $window.s;
        }]
    }]);

1 个答案:

答案 0 :(得分:0)

这应该这样做:

var app = angular.module('plunker', []);
app.config(function($filterProvider) {
    var fns = {};
    Object.keys(_.str).reduce(function(obj, key) {
        fns[key] = function() {
            return _.str[key];
        };
    }, {});
    $filterProvider.register(fns);
})
app.run(function($filter) {
    console.log($filter('slugify')('hello world'))
})

Plunker