web-dev-qa-db-ja.com

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

この方法で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;
    }
  });

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

74
Sergei Basharov

どうやらできる。

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

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. これには注意し、フィルター内の値を読み取るためだけにスコープを使用してください。そうしないと、$ digestループで自分を簡単に見つけることができます。
  2. このような「重い」依存関係(スコープ全体)を必要とするフィルターは、テストが非常に難しい傾向があります。
122
Stewie

thisがローカル$scopeを参照していることがわかりました。これが安全なアクセス方法であるかどうかはわかりません。

5
pavel_karoukin