วิธีสร้างตัวกรอง angularjs ซึ่งส่งออก HTML


91

หลังจากอ่านบทช่วยสอน 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>

ปัญหาคือ borwser แสดงค่าที่ส่งคืนตามตัวอักษร:

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

ไม่ใช่เป็นไอคอน (หรือ html ที่แสดงผล) ที่ควรปรากฏ

นี่คือตัวอย่าง JSFiddle

ฉันคิดว่าการฆ่าเชื้อบางอย่างเกิดขึ้นในระหว่างกระบวนการนี้

เป็นไปได้ไหมที่จะปิดการฆ่าเชื้อนี้สำหรับตัวกรองเฉพาะนี้

นอกจากนี้ฉันรู้วิธีแสดงไอคอนโดยไม่ส่งคืนเอาต์พุต HTML จากตัวกรอง แต่ใช้แค่ข้อความ 'ok' หรือ 'remove' ซึ่งฉันสามารถใช้แทน:

<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 I guess) เพื่อให้สามารถเห็นไอคอนเมื่อทำงานได้

ผมได้ให้ตัวอย่างการทำงาน


2
เป็นวิธีเดียวที่ฉันรู้ในการส่งออก html ดิบด้วย angularJS และการผูกนี้ได้รับอนุญาตเฉพาะในแอตทริบิวต์ดังนั้นคุณจึงไม่มีทางเลือกมากคุณสามารถเขียนคำสั่งของคุณเองที่ยอมรับความคิดเห็นหรือการผูกองค์ประกอบใช้ซอร์สโค้ดของการผูก 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
2.x เชิงมุมลดลงng-html-bind-unsafeและต้องการให้เนื้อหา html ถูกทำเครื่องหมายอย่างชัดเจนว่า 'ปลอดภัย' - ดู: docs.angularjs.org/api/ng.$sce#Example
hooblei

1
ควรมีตัวกรองเริ่มต้น html_safe:{{myContent | myFilter | html_safe}}
Augustin 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>
Grid Trekkor

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.