Come creare un filtro angularjs che restituisca HTML


90

Dopo aver letto il passaggio 9 del tutorial AngularJS, ho creato il mio filtro AngularJS, che dovrebbe convertire i dati booleani in html.

Ecco il mio codice filtro:

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

Ecco il mio codice HTML:

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

Il problema è che borwser visualizza il valore restituito letteralmente come:

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

non come icone (o renderizzate html) che dovrebbero apparire.

Ecco un esempio di JSFiddle

Penso che durante questo processo avvenga una certa sanificazione.

È possibile disattivare questa sanificazione per questo filtro specifico?

Inoltre so come visualizzare le icone non restituendo l'output HTML dal filtro ma piuttosto solo il testo 'ok' o 'rimuovi' che posso quindi sostituire con:

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

ma questo non è quello che voglio.

Risposte:


112

Dovresti usare la ng-bind-htmldirettiva (richiede di importare il modulo sanitize e il file js): https://docs.angularjs.org/api/ng/directive/ngBindHtml

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

Devi anche importare il CSS ( Bootstrap immagino) per poter vedere l'icona quando funziona.

Ho fornito un esempio funzionante .


2
Bene, è l'unico modo che conosco per produrre html grezzo con angularJS e questo binding è consentito solo sugli attributi, quindi non hai molta scelta, puoi scrivere la tua direttiva che accetta commenti o legami di elementi, prendi il codice sorgente di bind- html per un punto di partenza: github.com/angular/angular.js/blob/master/src/ngSanitize/…
Guillaume86

2
Una direttiva forse la soluzione più bella qui <check-icon ng: model = 'phone.connectivity.infrared'> </check-icon> ma non è molto più breve della tua soluzione;)
Guillaume86

7
Una cosa da notare è che è necessario includere il angular-sanitize.jsfile affinché funzioni. Se vuoi fare lo stesso senza includere questa libreria extra, puoi usare la ng-bind-html-unsafedirettiva.
nwinkler

4
angular 2.x cade ng-html-bind-unsafee richiede che i contenuti html siano esplicitamente contrassegnati come 'sicuri' - vedi: docs.angularjs.org/api/ng.$sce#Example
hooblei

1
Dovrebbe esserci un filtro predefinito html_safe:{{myContent | myFilter | html_safe}}
Augustin Riedinger

17

a meno che non lo stia leggendo male, ti stai avvicinando nel modo sbagliato

Penso che ng-class sia la direttiva necessaria per questo lavoro ed è più sicuro del rendering nell'attributo di classe.

nel tuo caso aggiungi semplicemente una stringa oggetto con le stringhe id come classe e il valore come espressione valutata

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

in una nota a margine, dovresti usare solo le direttive (integrate e personalizzate) per manipolare html / dom e se hai bisogno di un rendering html più complesso dovresti guardare invece la direttiva


Buona soluzione. O fatto un po 'più semplice: <i ng-class="phone.connectivity.infrared ? 'icon-ok' : 'icon-remove'"></i>
Grid Trekkor,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.