2015-02-15 3 views
1

Я изучаю 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; 
     }] 
    }]); 

ответ

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

+1

Хорошо, но поправьте меня, если я ошибаюсь: вы имеете дело с _.str глобальным, как в моем примере? – gremo

+0

Конечно, но почему это неправильно? он будет глобальным, если вы не берете внешний скрипт и не переносите его в службу (и даже тогда он будет глобальным, потому что угловой является глобальным). – Mosho

Смежные вопросы