2012-11-06 16 views
84

Dopo aver letto AngularJS tutorial step-9 Ho creato il mio filtro AngularJS, che dovrebbe convertire i dati booleani in html.Come creare il filtro angularjs che restituisce HTML

Ecco il mio codice di 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 visualizza borwser restituito il valore letterale:

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

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

Here is JSFiddle example

Penso che alcuni sanificazione si verifica durante questo processo.

È possibile disattivare questa sanificazione per questo filtro specifico?

Anche io so come visualizzare le icone non restituendo output HTML dal filtro, ma il testo piuttosto solo 'ok' o 'remove' che io possa poi sostituire a:

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

, ma questo non è quello che voglio .

risposta

107

si dovrebbe usare la direttiva ng-bind-html (richiedono 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> 

È inoltre necessario importare il CSS (Bootstrap credo) di essere in grado di vedere l'icona quando funziona

Ho fornito un .

+0

grazie per la risposta, ma la tua soluzione è quasi uguale alla mia con l'icona '' e nel mio caso non uso tag SPAN extra. –

+2

Beh, è ​​l'unico modo che conosco per generare HTML grezzo con angularJS e questa associazione è consentita solo sugli attributi in modo da non avere molta scelta, puoi scrivere la tua direttiva che accetta i collegamenti di commenti o elementi, prendi il codice sorgente di bind -html per un punto di partenza: https://github.com/angular/angular.js/blob/master/src/ngSanitize/directive/ngBindHtml.js – Guillaume86

+2

Una direttiva forse la soluzione più bella qui ma non è molto più breve della soluzione;) – Guillaume86

17

a meno che non sto leggendo male, si sta avvicinando in modo sbagliato

Penso ng-classe è la direttiva è necessario per questo lavoro ed è più sicuro poi rendering attributo di classe.

nel tuo caso è sufficiente aggiungere stringa di oggetto con le corde ID come la classe e il valore come l'espressione valutata

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

su un lato nota, si dovrebbe usare direttive (built-in e personalizzato) per manipolare html/dom e se avete bisogno di un più complesso html rendere si dovrebbe guardare direttiva invece

+0

Buona soluzione. O fatto un po 'più semplice: '' –

9

Prova questo filtro

filter('trust', ['$sce',function($sce) { 
    return function(value, type) { 
    return $sce.trustAs(type || 'html', value); 
    } 
}]); 

Gist Link

+3

questo non sembra funzionare – ErichBSchulz

+1

progressi? ha funzionato ad un certo punto –

Problemi correlati