Як створити angularjs-фільтр, який виводить HTML


90

Прочитавши підручник з AngularJS, крок 9, я створив власний фільтр AngularJS, який повинен перетворити логічні дані у html.

Ось мій код фільтра:

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>

Проблема в тому, що позичальник відображає повернене значення буквально як:

<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
Ну, це єдиний спосіб, який я знаю, щоб виводити необроблений html з angularJS, і це прив'язка дозволена лише для атрибутів, тому у вас немає великого вибору, ви можете написати власну директиву, яка приймає прив'язки коментарів або елементів, взяти вихідний код 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

4
angular 2.x падає ng-html-bind-unsafeі вимагає, щоб вміст html був явно позначений як "безпечний" - див .: docs.angularjs.org/api/ng.$sce#Example
hooblei

1
Має бути за замовчуванням фільтр html_safe:{{myContent | myFilter | html_safe}}
Августин Рідінгер,

17

якщо я не читаю це неправильно, ви підходите неправильно

Я думаю, що ng-class - це директива, яка вам потрібна для цієї роботи, і є безпечнішою, ніж відтворення в атрибут class.

у вашому випадку просто додайте рядок об'єкта із рядками ідентифікатора як клас, а значення як обчислюваний вираз

<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>
Grid Trekkor

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.