Cách tạo bộ lọc anglejs xuất ra HTML


90

Sau khi đọc hướng dẫn AngularJS bước-9, tôi đã tạo bộ lọc AngularJS của riêng mình, bộ lọc này sẽ chuyển đổi dữ liệu boolean thành html.

Đây là mã bộ lọc của tôi:

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

Đây là mã HTML của tôi:

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

Vấn đề là borwser hiển thị giá trị trả về theo nghĩa đen là:

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

không phải là các biểu tượng (hoặc html được kết xuất) sẽ xuất hiện.

Đây là ví dụ về JSFiddle

Tôi nghĩ rằng một số sanitisation xảy ra trong quá trình này.

Có thể tắt chế độ vệ sinh này cho bộ lọc cụ thể này không?

Ngoài ra, tôi biết cách hiển thị các biểu tượng bằng cách không trả lại đầu ra HTML từ bộ lọc mà chỉ trả về văn bản 'ok' hoặc 'remove' mà sau đó tôi có thể thay thế thành:

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

nhưng đây không phải là điều tôi muốn.

Câu trả lời:


112

Bạn nên sử dụng lệnh ng-bind-html(yêu cầu nhập mô-đun sanitize và tệp js): https://docs.angularjs.org/api/ng/directive/ngBindHtml

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

Bạn cũng cần nhập CSS ( tôi đoán là Bootstrap ) để có thể nhìn thấy biểu tượng khi nó hoạt động.

Tôi đã cung cấp một ví dụ làm việc .


2
Đó là cách duy nhất tôi biết để xuất ra html thô với angleJS và ràng buộc này chỉ được phép trên các thuộc tính, vì vậy bạn không có nhiều lựa chọn, bạn có thể viết chỉ thị của riêng mình chấp nhận các nhận xét hoặc các phần tử ràng buộc, lấy mã nguồn của bind- html cho điểm bắt đầu: github.com/angular/angular.js/blob/master/src/ngSanifying/…
Guillaume86

2
Một chỉ có thể là giải pháp đẹp nhất ở đây <check-icon ng: mô hình = 'phone.connectivity.infrared'> </ check-icon> nhưng nó không thực sự ngắn hơn so với giải pháp của bạn;)
Guillaume86

7
Một điều cần lưu ý là bạn cần bao gồm angular-sanitize.jstệp để việc này hoạt động. Nếu bạn muốn làm điều tương tự mà không bao gồm thư viện bổ sung này, bạn có thể sử dụng ng-bind-html-unsafechỉ thị.
nwinkler

4
góc 2.x giảm ng-html-bind-unsafevà đòi hỏi nội dung html để được rõ ràng đánh dấu là 'an toàn' - xem: docs.angularjs.org/api/ng.$sce#Example
hooblei

1
Phải có một bộ lọc mặc định html_safe:{{myContent | myFilter | html_safe}}
Augustin Riedinger,

17

trừ khi tôi đọc nhầm, bạn đang tiếp cận sai cách

Tôi nghĩ ng-class là chỉ thị bạn cần cho công việc này và an toàn hơn khi hiển thị thuộc tính lớp.

trong trường hợp của bạn, chỉ cần thêm chuỗi đối tượng với chuỗi id là lớp và giá trị là biểu thức được đánh giá

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

một lưu ý nhỏ, bạn chỉ nên sử dụng các chỉ thị (tích hợp sẵn và tùy chỉnh) để thao tác html / dom và nếu bạn cần kết xuất html phức tạp hơn, bạn nên xem chỉ thị thay thế


Giải pháp tốt. Hoặc thực hiện đơn giản hơn một chút: <i ng-class="phone.connectivity.infrared ? 'icon-ok' : 'icon-remove'"></i>
Grid Trekkor

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.