我正在尝试创建自定义过滤器,但是当我尝试将其注入(inject) Controller 时,出现“未知提供程序”错误。我已经检查并仔细检查了所有引用资料,但我看不出有什么问题。

我知道该文件在我的 index.html 中被正确引用,它被加载并且可以被检查员找到。这是我的代码:

在我的 app.js 中:

angular.module('equiclass', ['equiclass.controllers',
                         'equiclass.services',
                         'ngRoute'])
.config(function ($routeProvider) {
$routeProvider
  .when('/courses', {
    templateUrl: 'views/courses.html',
    controller: 'CourseCtrl'
  // And some other stuff with routes
});

angular.module('equiclass.controllers', ['equiclass.services', 'equiclass.filters']);
angular.module('equiclass.services', []);
angular.module('equiclass.filters', []);

我的过滤器:
angular.module('equiclass.filters')
  .filter('testFilter', function() {
    return function(input) {
      return undefined;
    };
});

和 Controller :
angular.module('equiclass.controllers')
  .controller('CourseCtrl', function ($scope, testFilter) {

  });

当然,这很简单,但它不起作用,我不明白为什么。我提供了几项服务,它们都很好地工作和玩耍。

最佳答案

您不需要注入(inject)过滤器本身。

这段代码...

angular.module('equiclass.controllers')
  .controller('CourseCtrl', function ($scope, testFilter) {

  });

应该
angular.module('equiclass.controllers')
  .controller('CourseCtrl', function ($scope) {

  });

CourseCtrl 内,您应该像往常一样使用过滤器。

将模块 'equiclass.filters' 注入(inject)您的模块 'equiclass.controllers' 就足够了。

我有一个类似的问题,并发表了一篇关于它的帖子 on my blog

- 编辑

正如 n00dl3 在下面提到的,棘手的部分是自动命名约定在 Angular 中的工作方式。如果您将过滤器命名为 specialNumberFilter ,那么当您注入(inject)它时,您需要将其称为 specialNumberFilterFilter 。这允许您将过滤器用作函数,这就是它的本质。
// In a controllervm.data = specialNumberFilterFilter(vm.data, 'a');
但是我相信如果过滤器用于正在评估的字符串表达式中,例如 watch ,您也可以使用过滤器而不将其注入(inject) Controller ,因为这与您在模板中使用它时的场景相同.
// Inside a watch - no controller injection required`$scope.$watch('vm.data | specialNumberFilter', function(new, old) { ... })`

关于AngularJS 1.x 自定义过滤器无法注入(inject),未知提供者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23105315/

10-16 16:09