Подтвердить что ты не робот

AngularJS: расширение встроенных фильтров

Я хотел бы изменить фильтр currency для обработки пользовательских форматов денег во входном значении.

(например, AUD 3.00 -> $3.00).

Один из вариантов - написать собственный фильтр с нуля. Однако это похоже на много дублирование, учитывая, что существующий фильтр замечательный, мне просто нужно обрезать несколько символов спереди.

В идеале у меня было бы что-то вроде этого:

.filter('money', function($filters) {
    return function(text){
        var currency = text.substring(4)
        return $filters('currency')(currency)
    };
});

Можно ли:

  • Вызов одного фильтра из другого?
  • Доступ к внутренним методам (например, formatNumber() показан здесь

Какие еще варианты доступны для меня?

4b9b3361

Ответ 1

  • Вызов одного фильтра из другого?

Да и лучшим решением, которое я нашел, было создание нового фильтра:

angular.module('ui.filters').filter('customCurrency',
    [ '$filter', function(filter) {
      var currencyFilter = filter('currency');
      return function(amount, currencySymbol) {
        return currencyFilter(amount.substr(4), currencySymbol);
      }
    } ]);

Это преобразует значения типа " AUD 30,00" в " $30,00"

Вы не можете, из того, что я пробовал, с версии 1.0.1 переопределить фильтр. Я попытался создать фильтр с тем же именем, и попытка ссылки на исходный фильтр вызывает бесконечный цикл.

Здесь - отличный момент для рассмотрения:

Однако я бы предложил не делать этого - даже если это разрешено. Предопределенные фильтры - это открытый API AngularJS. Что делать, если некоторые части of AngularJS используют некоторые из них внутри или один день, когда вы устанавливаете некоторые надстройка, которая зависит от этого фильтра?

Смотрите также, в основном тот же вывод, хотя я считаю, что op действительно не нужен специальный фильтр.

  • Доступ к внутренним методам (например, formatNumber())?

Если функция не раскрывается, авторы считают, что это не публичная реклама, которую они хотели сделать доступной. У авторов может быть определенная конкретная функция выполнения, которая может быть сразу не очевидна.

PS: модуль - это то, что вам нужно, чтобы фильтр был включен. Я разделяю некоторые функции в разных модулях и требую их при создании моего основного модуля

var App = angular.module('App', [ 'ui' ]);

Ответ 2

Лучший способ сделать это -

<div> {{amount | currency:'$'}} </div>

в вашем html. Это автоматически сбрасывает первые несколько символов, соответствующих типу валюты, и заменяет их строковым аргументом '$', который вы передаете.

Ответ 3

Angular Валютный фильтр позволяет использовать символ валюты по умолчанию из службы локали, или вы можете предоставить фильтр с символом пользовательской валюты. Если ваше приложение будет использоваться только в одном языковом коде, все равно, чтобы использовать символ валюты по умолчанию. Однако, если вы ожидаете, что зрители в других местах могут использовать ваше приложение, вы должны предоставить свой собственный символ валюты, чтобы убедиться, что фактическое значение понято.

Например, если вы хотите отображать остаток на счете в 1000 долларов со следующей привязкой, содержащей валютный фильтр: {{1000 | currency}}, и ваше приложение в настоящее время находится в en-US locale. Отобразится "$ 1000,00". Однако, если кто-то из другого локального (скажем, Японии) просматривает ваше приложение, ее браузер укажет локаль как ja, и вместо этого будет отображаться баланс "1000,00". Это действительно расстроит вашего клиента.

В этом случае вам необходимо переопределить символ валюты по умолчанию, предоставив фильтр валюты символу валюты в качестве параметра при настройке фильтра, например, 1000 долларов США. Таким образом, Angular всегда будет показывать баланс "1000 долларов США" и игнорировать любые изменения локали.

См. примечания по локализации: http://docs.angularjs.org/guide/i18n