HTMLを出力するangularjsフィルターを作成する方法


90

AngularJSチュートリアルの手順9 を読んだ後、ブールデータをHTMLに変換する独自のAngularJSフィルターを作成しました。

これが私のフィルターコードです:

angular.module('phonecatFilters', []).filter('iconify', function () { // My custom filter
    return function (input) {
        return input ? '<i class="icon-ok"></i>' : '<i class="icon-remove"></i>';
    }
});

これが私のHTMLコードです:

<dt>Infrared</dt>
  <dd>{{phone.connectivity.infrared | iconify }}"></dd>

問題は、borwserが文字通り次のように戻り値を表示することです。

<i class="icon-ok"></i>

表示されるはずのアイコン(またはレンダリングされたhtml)ではありません。

ここにJSFiddleの例があります

この過程である程度の衛生状態が発生すると思います。

この特定のフィルターに対してこのサニタイズをオフにすることは可能ですか?

また、フィルターからHTML出力を返さずにアイコンを表示する方法も知っています。代わりに、次のように置き換えることができます。

<i class="icon-{{phone.connectivity.infrared | iconify}}"><i>

しかし、これは私が望むものではありません。

回答:


112

ng-bind-htmlディレクティブを使用する必要があります(サニタイズモジュールとjsファイルをインポートする必要があります):https : //docs.angularjs.org/api/ng/directive/ngBindHtml

<span ng-bind-html='phone.connectivity.infrared | iconify'></span>

また、アイコンが機能するときにアイコンを表示できるように、CSS(Bootstrapだと思います)をインポートする必要もあります。

実用的な例を提供しました


2
まあそれは私がangularJSで生のhtmlを出力する唯一の方法であり、このバインディングは属性でのみ許可されているため、選択肢はほとんどありません。コメントまたは要素のバインディングを受け入れる独自のディレクティブを記述し、bind-のソースコードを取得できます:始点のHTML github.com/angular/angular.js/blob/master/src/ngSanitize/...
Guillaume86

2
ディレクティブはおそらくここで最も優れたソリューションです<check-icon ng:model = 'phone.connectivity.infrared'> </ check-icon>が、実際のソリューションよりも短いわけではありません;)
Guillaume86

7
angular-sanitize.jsこれを機能させるには、ファイルを含める必要があることに注意してください。この追加のライブラリを含めずに同じことをしたい場合は、ng-bind-html-unsafeディレクティブを使用できます。
nwinkler 2013

4
angular 2.xはドロップng-html-bind-unsafeし、htmlコンテンツを「安全」として明示的にマークする必要があります-参照:docs.angularjs.org/api/ng.$sce#Example
hooblei

1
:デフォルトのフィルタhtml_safeがあるはず{{myContent | myFilter | html_safe}}
オーギュRiedinger

17

私がそれを間違って読んでいない限り、あなたは間違った方法で近づいています

ng-classはこのジョブに必要なディレクティブであり、クラス属性にレンダリングするよりも安全だと思います。

あなたのケースでは、クラスとしてid文字列、評価された式として値を持つオブジェクト文字列を追加するだけです

<i ng-class="{
'icon-ok':!phone.connectivity.infrared,
'icon-remove':phone.connectivity.infrared
}"></i>'

余談ですが、html / domの操作にはディレクティブ(組み込みおよびカスタム)のみを使用してください。より複雑なhtmlレンダーが必要な場合は、代わりにディレクティブを確認してください。


良い解決策。またはビット単純に行わ: <i ng-class="phone.connectivity.infrared ? 'icon-ok' : 'icon-remove'"></i>
グリッドTrekkor

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.