javascript angularjs scope

javascript - ng-model



Variables de ámbito de acceso de un filtro en AngularJS (2)

Estoy pasando el valor de la date a mi filtro personalizado de esta manera:

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

Me gustaría incluir un par de variables de ámbito también, como lo que puedo hacer en directivas. ¿Es posible hacer esto sin tener que pasar estos vars explícitamente como argumentos de función?


Aparentemente puedes.

Por lo general, pasaría variables de ámbito al filtro como parámetro de función:

function MyCtrl($scope){ $scope.currentDate = new Date(); $scope.dateFormat = ''short''; }

<span ng-controller="MyCtrl">{{currentDate | date:dateFormat}}</span> // --> 7/11/13 4:57 PM

Pero, para pasar el alcance actual en, tendría que pasar this :

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

y this será una referencia al alcance actual:

Simplificado:

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

Advertencia:

  1. Tenga cuidado con esto y use el alcance solo para leer los valores dentro del filtro, porque de lo contrario encontrará fácilmente su auto en $ digest loop.
  2. Los filtros que requieren una dependencia tan "pesada" (todo el alcance) tienden a ser muy difíciles de probar.

Descubrí que this referencia al $scope local. No estoy seguro si esta es una forma segura de acceder a ella.