Toegang tot bereikvariabelen vanuit een filter in AngularJS

Ik geef de waarde dateop deze manier door aan mijn aangepaste 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;
    }
  });

Ik zou daar ook een aantal scopevariabelen willen injecteren, zoals wat ik in richtlijnen kan doen. Is dat mogelijk om dit te doen zonder deze vars expliciet door te geven als functieargumenten?


Antwoord 1, autoriteit 100%

Blijkbaar kan dat.

Meestal geeft u bereikvariabelen door aan het filter als functieparameter:

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

Maar om het huidige bereik door te geven, moet u thisdoorgeven:

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

en thiszal een verwijzing zijn naar het huidige bereik:

Vereenvoudigd:

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

Waarschuwing:

  1. Wees hier voorzichtig mee en gebruik het bereik alleen om de waarden in het filter te lezen, want anders kom je gemakkelijk in de $digest-lus terecht.
  2. Filters die zo’n “zware” afhankelijkheid (het hele bereik) vereisen, zijn meestal erg moeilijk te testen.

Antwoord 2, autoriteit 4%

Ik ontdekte dat thisverwijst naar lokale $scope. Ik weet niet zeker of dit een veilige manier is om toegang te krijgen.

Other episodes