HTML çıktısı veren angularjs filtresi nasıl oluşturulur


91

AngularJS öğretici adım-9'u okuduktan sonra , boole verilerini html'ye dönüştürmesi gereken kendi AngularJS filtremi oluşturdum.

İşte filtre kodum:

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

İşte HTML kodum:

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

Sorun şu ki, Borwser döndürülen değeri tam anlamıyla şu şekilde görüntülüyor:

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

görünmesi gereken simgeler (veya oluşturulmuş html) olarak değil.

İşte JSFiddle örneği

Sanırım bu süreçte bir miktar temizlik meydana geliyor.

Bu özel filtre için bu temizlemeyi kapatmak mümkün müdür?

Ayrıca, filtreden HTML çıktısını döndürmeyerek simgelerin nasıl görüntüleneceğini biliyorum, bunun yerine yalnızca 'tamam' veya 'kaldır' metni daha sonra yerine koyabileceğim:

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

ama istediğim bu değil.

Yanıtlar:


112

Yönergeyi kullanmalısınız ng-bind-html(sanitize modülünü ve js dosyasını içe aktarmanız gerekir): https://docs.angularjs.org/api/ng/directive/ngBindHtml

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

Simgeyi çalışırken görebilmek için CSS'yi ( sanırım Bootstrap ) içe aktarmanız gerekir .

Çalışan bir örnek verdim .


2
AçısalJS ile ham html çıktısını almanın tek yolu budur ve bu bağlamaya yalnızca özniteliklerde izin verilir, böylece fazla seçeneğiniz yoktur, yorumları veya öğe bağlamalarını kabul eden kendi yönergenizi yazabilirsiniz, bağlama kaynak kodunu alın. başlangıç ​​noktası için html: github.com/angular/angular.js/blob/master/src/ngSanitize/…
Guillaume86

2
Bir yönerge buradaki en güzel çözüm olabilir <check-icon ng: model = 'phone.connectivity.infrared'> </check-icon> ama bu sizin çözümünüzden çok daha kısa değil;)
Guillaume86

7
Unutulmaması gereken bir şey, bunun angular-sanitize.jsçalışması için dosyayı eklemeniz gerektiğidir . Bu fazladan kitaplığı dahil etmeden aynısını yapmak istiyorsanız, ng-bind-html-unsafeyönergeyi kullanabilirsiniz .
nwinkler

4
açısal 2.x düşer ng-html-bind-unsafeve html içeriğinin açıkça 'güvenli' olarak işaretlenmesini gerektirir - bkz: docs.angularjs.org/api/ng.$sce#Örnek
hooblei

1
Varsayılan bir filtre olmalıdır html_safe:{{myContent | myFilter | html_safe}}
Augustin

17

ben yanlış okumadıysam, yanlış yöne yaklaşıyorsun

Sanırım ng-sınıfı, bu iş için ihtiyaç duyduğunuz yönerge ve sınıf niteliğine göre daha güvenli.

sizin durumunuzda, sınıf olarak id dizelerini ve değerlendirilen ifade olarak değeri içeren nesne dizesini ekleyin

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

bir yan not olarak, html / dom'u değiştirmek için yalnızca yönergeleri (yerleşik ve özel) kullanmalısınız ve daha karmaşık bir html oluşturmaya ihtiyacınız varsa, bunun yerine yönergeye bakmalısınız.


Güzel çözüm. Ya da biraz daha basit: <i ng-class="phone.connectivity.infrared ? 'icon-ok' : 'icon-remove'"></i>
Grid Trekkor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.