从AngularJS中的filter访问范围variables

我将date值传递给我的自定义filter:

 angular.module('myapp'). filter('filterReceiptsForDate', function () { return function (input, date) { var out = _.filter(input, function (item) { return moment(item.value.created).format('YYYY-MM-DD') == date; }); return out; } }); 

我也想在这里注入一些范围variables,就像我可以在指令中做的那样。 是否有可能做到这一点,而不必作为函数参数显式传递这些variables?

显然你可以。

通常你可以将作用域variables作为函数parameter passing给filter:

 function MyCtrl($scope){ $scope.currentDate = new Date(); $scope.dateFormat = 'short'; } 
 <span ng-controller="MyCtrl">{{currentDate | date:dateFormat}}</span> // --> 7/11/13 4:57 PM 

但是,要通过当前的范围,你必须通过this

 <span ng-controller="MyCtrl">{{currentDate | date:this}}</span> 

this将是对当前范围的参考:

简化:

 app.controller('AppController', function($scope) { $scope.var1 = 'This is some text.'; $scope.var2 = 'And this is appended with custom filter.'; } ); app.filter('filterReceiptsForDate', function () { return function (input, scope) { return input + ' <strong>' + scope.var2 + '</strong>'; }; }); 
 <div ng-bind-html-unsafe="var1 | filterReceiptsForDate:this"></div> <!-- Results in: "This is some text. <strong>And this is appended with custom filter.</strong>" --> 

PLUNKER

警告:

  1. 注意这一点,并使用范围只读取filter内的值,因为否则,你会很容易find你自己在$摘要循环。
  2. 需要这种“重”依赖性(整个范围)的filter往往很难testing。

我发现this引用本地$scope 。 不知道这是否是安全的方式来访问它。