使用角度过滤器作为指令内的函数

时间:2014-07-07 00:20:03

标签: javascript angularjs angularjs-directive angular-filters

我有一个函数(shortenNum)通过在其末尾添加“K”或“M”并剥离零来“缩短”数字。我决定把它变成一个过滤器,因为我在Angular上。

过滤器/函数必须在指令内部应用,而不是标记。我在指令中注入了过滤器本身,但是当我尝试使用它时,函数本身就抛出了错误:

错误:[$ injector:unpr]未知提供者:shortenNumProvider< - shortenNum< - d3PieDirective http://errors.angularjs.org/1.2.10/ $注射器/ unpr?P0 = shortenNumProvider%20%3 C-%20shortenNum%20%3 C-%20d3PieDirective ...

指令:

myApp.directive('d3Pie', [
  '$window', 
  'd3Service', 
  'shortenNum',
  function($window, d3Service, shortenNum) {
  return {
    ...

  // eventually call
  return shortenNum(d.data.count);

过滤

// Rewrites a given number in a shorthand form
myApp.filter('shortenNum', function(num) {
  if(num > 99999) { return (num/1000000).toFixed(1) + 'M'; }
  if(num > 999) { return (num/1000).toFixed(1) + 'K'; }
  return num;
});

首先:这是否应该使用过滤器?

第二:如果是这样,我的语法/概念错误是什么?

1 个答案:

答案 0 :(得分:0)

我已经发布了两种方法,你可以在这个小提琴中使用你的过滤器:

http://jsfiddle.net/9Ymvt/1844/

在指令或服务中使用过滤器是完全可以接受的,但是您需要将过滤器注入到指令中。您可以注入$filter,但本着只需要您需要的精神,可能更好地注入单个过滤器,如下所示:

angular.module('components', [])
    .directive('controllerFilter', function (shortNumFilter) {
    return {
        restrict: 'E',
        scope:{
            num:'@'
        },
        template: '<span>controllerFilter: {{ filteredNum }}</span>',
        controller: function ($scope, $element, $attrs) {
            $scope.$watch('num', function(newVal, oldVal) {
                $scope.filteredNum = shortNumFilter(newVal);
            })
        }
     }
})