Javascript 从AngularJS中的筛选器访问范围变量

Javascript 从AngularJS中的筛选器访问范围变量,javascript,angularjs,scope,Javascript,Angularjs,Scope,我通过以下方式将date值传递给我的自定义筛选器: 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
值传递给我的自定义筛选器:

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;
    }
  });
我也想在那里注入一些范围变量,就像我在指令中可以做的那样。不需要将这些变量显式地作为函数参数传递就可以做到这一点吗?

显然可以

通常,您会将范围变量作为函数参数传递给过滤器:

函数MyCtrl($scope){
$scope.currentDate=新日期();
$scope.dateFormat='short';
}
{{currentDate | date:dateFormat}}/-->7/11/13下午4:57
但是,要传入当前作用域,您必须传入
this

{{currentDate | date:this}
将作为当前范围的参考:

简化:

app.controller('AppController'),
职能($范围){
$scope.var1='这是一些文本';
$scope.var2='这是附加的自定义筛选器';
}
);
app.filter('filterReceiptsForDate',函数(){
返回函数(输入、范围){
返回输入+''+scope.var2+'';
};
});

警告:
  • 注意这一点,使用scope只读取过滤器内的值,否则您将很容易在$digest循环中找到您自己
  • 需要这种“重”依赖关系(整个范围)的过滤器往往很难测试

  • 我发现
    这个
    引用了本地
    $scope
    。不确定这是否是一种安全的访问方式。

    谢谢您的全面回答。我想我最好把这些变量显式地传递给过滤器。谢谢!对于阅读本文的其他人,除非传递html,否则不必使用
    ng bind html unsafe
    。此外,我使用了
    $scope
    而不是
    scope
    ,因此它在过滤器的函数中与我在其他任何地方使用的函数相同:)如果确实需要更新范围变量,则应该在
    控制器中移动过滤器。这样,它就没有“严重”的依赖性,并且更容易测试。只需在
    控制器中使用
    $filter('filter')(数组、表达式、比较器、anyPropertyKey)