Как передать переменные вне области видимости в фильтр AngularJS?

У меня есть массив пар сумм и валют. Последний не просто «доллар США» или «евро», но объект, который содержит правила форматирования для этой валюты. Я написал фильтр для форматирования суммы, но он работает только в том случае, если я жестко закодировал аргументы форматирования:

// arguments: currency symbol, is symbol prefix, decimal symbol, digit group symbol
{{ entry.amount | currency24: '$',true,'.',',' } //USD example
{{ entry.amount | currency24: '€',false,'.',',' } //EUR example

То, что я хотел бы сделать, это поместить туда весь объект вот так:

{{entry.amount | currency24: entry.currency }} // currency object holds all the formatting parameters, but I could just as well pass them one by one

Как я могу этого добиться?

РЕДАКТИРОВАТЬ: entry не является частью $scope. Это происходит от ng-repeat:

ng-repeat="entry in entries"

Вот почему у меня проблемы с передачей его фильтру.


person gligoran    schedule 13.11.2014    source источник
comment
Можете ли вы показать свою реализацию фильтра currency24?   -  person Ilan Frumer    schedule 14.11.2014


Ответы (1)


Вы можете передать любой объект для фильтрации, как вы упомянули.

HTML-разметка остается такой же, как вы хотели:

<p ng-repeat="entry in entries">
  {{entry.amount | currency24: entry.currency }}
</p>

И следующий код делает то, что вы просили:

.controller('DemoController', function($scope) {
    $scope.entries = [{
      amount: 35,
      currency: {
        symbol: '$'
      }
    }, {
      amount: 40,
      currency: {
        symbol: '€'
      }
    }];
})

.filter('currency24', function() {
  return function(amount, currencyObject) {
    return amount + currencyObject.symbol;
  };
});

И посмотрите на этот плункер.

person halilb    schedule 13.11.2014
comment
Забыл упомянуть, что запись не в $scope, а из ng-repeat: ng-repeat="entry in entries". entries, но находится в $scope. Я отредактировал свой вопрос, чтобы отразить это. - person gligoran; 14.11.2014
comment
это не должно быть проблемой, я думаю. я обновил ответ и plunker. я неправильно понял ваш вопрос? - person halilb; 14.11.2014
comment
Вы правы. Я обнаружил, что моя проблема была в другой части моего приложения, из-за чего объект entry.currency был фактически неопределенным. Большое спасибо за твою помощь. - person gligoran; 14.11.2014