如何在过滤器中获取 AngularJS 控制器

How to get an AngularJS controller in a filter

是否可以使用依赖注入来引用过滤器内部的控制器?我尝试了以下方法:

app.filter('myFilter', function(MyCtrl) {...})
app.controller('MyCtrl', function(...) {})

但是我得到一个错误,找不到 MyCtrl 依赖项。

其实是这样的:

只需将 $filter 注入您的控制器

.controller('myController', function($scope, $filter) {...});

然后你想在哪里使用那个过滤器并不重要,就像这样使用它:

$filter('filterName');

如果您想将参数传递给该过滤器,请使用单独的括号:

.controller('myController', function($scope, $filter) {
   $filter('filterName')(argument1,argument2);
});

如果您正在尝试访问过滤器中的某种状态信息,您应该考虑将该功能移动到服务中,然后从过滤器和控制器访问该服务。

我想不出要在过滤器内实例化控制器的理由,所以也许如果您提供更多关于您试图解决的问题的背景信息,我们可以为您提供更多定制信息最好实施它。

无论如何,here's a Plunk 显示过滤器和控制器共享一些数据:

app.controller('MainCtrl', function($scope, MyService) {
  $scope.text = "ABCDEFG";
  $scope.data = 2;

  $scope.$watch('data', function() {
    MyService.setData($scope.data);
  })
});

app.service('MyService', function() {
  service = {}; // the service object we'll return

  var dataValue = 'data';

  service.setData = function(data) {
    dataValue = data;
  }

  service.getData = function() {
    return dataValue;
  }

  return service;
});

app.filter('truncate', function(MyService) {
  return function(input) {
    return input.substring(0, MyService.getData());
  };
});

如果您检查了 plunk,请注意您必须更新文本以使过滤器重新运行显示更新的字符数。