如何创建输出HTML的angularjs过滤器

时间:2012-11-06 12:57:44

标签: angularjs

阅读AngularJS tutorial step-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)。

Here is JSFiddle example

我认为在这个过程中会发生一些消毒。

是否可以针对此特定过滤器关闭此清理功能?

此外,我知道如何通过不从过滤器返回HTML输出来显示图标,而只是“ok”或“remove”文本,然后我可以替换为:

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

但这不是我想要的。

3 个答案:

答案 0 :(得分:111)

您应该使用ng-bind-html指令(要求导入sanitize模块和js文件): https://docs.angularjs.org/api/ng/directive/ngBindHtml

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

您还需要导入CSS(我猜是Bootstrap)才能在图标工作时看到它。

我提供了working example

答案 1 :(得分:17)

除非我读错了,否则你的方法是错误的

我认为ng-class是你需要这个工作的指令,比渲染到class属性更安全。

在您的情况下,只需添加id字符串作为类的对象字符串,并将值作为计算表达式

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

在旁注中,你应该只使用指令(内置和自定义)来操作html / dom,如果你需要更复杂的html渲染,你应该看看指令

答案 2 :(得分:12)

试试此过滤器

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

需要angular-sanitize

var app = angular.module("myApp", ['ngSanitize']);

Gist Link