Я изучаю 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
. Он чувствует себя не так.
Как вы думаете, это плохая идея? Подумайте, что я управляю зависимостями, используя беседу с x.y.*
semver, поэтому я должен основывать «безопасные» с точки зрения изменений.
EDIT: другое рабочее решение, но опять-таки плохое; поставщик услуг регистрации и его фильтры и использование глобальной 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;
}]
}]);
Хорошо, но поправьте меня, если я ошибаюсь: вы имеете дело с _.str глобальным, как в моем примере? – gremo
Конечно, но почему это неправильно? он будет глобальным, если вы не берете внешний скрипт и не переносите его в службу (и даже тогда он будет глобальным, потому что угловой является глобальным). – Mosho