14

currency入力値のカスタムマネーフォーマットを処理するようにフィルターを変更したいと思います。

(例:)AUD 3.00 -> $3.00

1つのオプションは、独自のフィルターを最初から作成することです。ただし、これは多くの重複のように思われます。既存のフィルターが優れていることを考えると、最初に前面から数文字をトリミングする必要があります。

理想的には、私はこのようなものを持っているでしょう:

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

次のいずれかが可能です。

  • あるフィルターを別のフィルターから呼び出しますか?
  • 内部メソッドにアクセスします(例:ここformatNumber()に表示)

このために他にどのようなオプションがありますか?

4

3 に答える 3

29
  • あるフィルターを別のフィルターから呼び出しますか?

はい、私が見つけた最善の解決策は、新しいフィルターを作成することでした。

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

これにより、「AUD30.00」のような値が「$30.00」に変換ます

私が試したことから、バージョン1.0.1の時点でフィルターをオーバーライドすることはできません。同じ名前を使用してフィルターを作成しようとしましたが、元のフィルターを参照しようとすると、無限ループが発生します。

考慮すべき優れた点は次のとおりです

ただし、許可されている場合でも、そうしないことをお勧めします。事前定義されたフィルターは、AngularJSのパブリックAPIです。AngularJSの一部がそれらの一部を内部で使用している場合、またはある日、そのフィルターに依存するアドオンをインストールした場合はどうなりますか?

opも実際にはカスタムフィルターを必要としないと私は信じていますが、基本的に同じ結論も参照してください。

  • 内部メソッドにアクセスしますか(たとえば、formatNumber())?

関数が公開されていない場合、作成者は、それが利用可能にしたいと考えていたパブリックAPIではないと見なしました。著者は、すぐには明らかではないかもしれない特定の実装固有の機能を持っているかもしれません。

PS:モジュールは、フィルターを入れるために必要なものです。いくつかの機能を異なるモジュールに分けて、メインモジュールを構築するときにそれらを必要とします

var App = angular.module('App', [ 'ui' ]);
于 2012-11-09T13:06:04.830 に答える
1

これを行うための最良の方法は、

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

あなたのhtmlで。これにより、通貨タイプに対応する最初の数文字が自動的に削除され、渡した文字列引数'$'に置き換えられます。

于 2015-02-09T06:22:18.357 に答える
0

Angularの通貨フィルターを使用すると、ロケールサービスのデフォルトの通貨記号を使用することも、カスタムの通貨記号をフィルターに提供することもできます。アプリが1つのロケールでのみ使用される場合は、デフォルトの通貨記号を使用することをお勧めします。ただし、他のロケールの視聴者がアプリを使用する可能性があると予想される場合は、実際の値が確実に理解されるように、独自の通貨記号を提供する必要があります。

たとえば、通貨フィルターを含む次のバインディングを使用して1000ドルの口座残高を表示する場合:{{1000 | 通貨}}であり、アプリは現在en-USロケールにあります。「$1000.00」が表示されます。ただし、別のローカル(たとえば、日本)の誰かがアプリを表示すると、そのブラウザはロケールをjaとして指定し、代わりに「¥1000.00」の残高が表示されます。これは本当にあなたのクライアントを混乱させるでしょう。

この場合、フィルターを構成するときにパラメーターとして通貨記号を通貨フィルターに指定することにより、デフォルトの通貨記号をオーバーライドする必要があります(例:USD $ 1,000.00)。このように、Angularは常に「USD $ 1000」の残高を表示し、ロケールの変更を無視します。

ローカリゼーションに関する注意事項を参照してください:http://docs.angularjs.org/guide/i18n

于 2012-11-09T16:40:06.780 に答える