1. ホーム
  2. javascript

AngularJSでフィルタからスコープ変数にアクセスする

2023-12-08 08:08:28

質問

私は 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;
    }
  });

私はディレクティブでできるように、そこにいくつかのスコープ変数を注入したいと思います。関数の引数として明示的にこれらの変数を渡すことなく、これを行うことは可能でしょうか?

どのように解決するのですか?

どうやらできるようです。

通常、関数のパラメータとしてスコープ変数をフィルタに渡します。

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>" -->

プランカー

警告

  1. フィルタの中の値を読むときだけスコープを使うようにしましょう。そうしないと、簡単に $digest ループに入ってしまいます。
  2. このような依存関係 (スコープ全体) を必要とするフィルタは、テストが非常に困難になる傾向があります。