我正在学习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;
}]
}]);
答案 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'))
})