angular.js ng-repeat 带有 html 内容的项目

Posted

技术标签:

【中文标题】angular.js ng-repeat 带有 html 内容的项目【英文标题】:angular.js ng-repeat li items with html content 【发布时间】:2013-10-07 07:50:27 【问题描述】:

我有一个从服务器返回的模型,它包含 html 而不是文本(例如 b 标签或 i 标签) 当我使用 ng-repeat 从中构建列表时,它将 html 显示为纯文本,是否有内置过滤器或指令将 html 放入 li 项目中? 我查看了文档,但由于我对它还是很陌生,所以很难找到它。

ng-重复:

    <li ng-repeat="opt in opts">

JSFiddle:

http://jsfiddle.net/gFFBa/1/

【问题讨论】:

在您的 jsFiddle 中,您尝试将 html 放入 option 标记中。你做不到:***.com/questions/11237807/… 我加入了错误的小提琴,我的错现在它是正确的 好的,看看我的回答 【参考方案1】:

如果您希望某个元素包含 HTML 值,请查看 ngBindHtmlUnsafe。

如果您想为 native 选择中的选项设置样式,那是不可能的。

【讨论】:

对不起,我忘记更新小提琴了,如果你现在看,你会看到我想要完成的事情,我很抱歉 以及您如何将它与ng-repeat 指令一起使用?【参考方案2】:

您可以使用NGBindHTML 或NGbindHtmlUnsafe 这不会逃避模型的html 内容。

http://jsfiddle.net/n9rQr/

<div ng-app ng-controller="MyCtrl">
    <ul>
    <li ng-repeat=" opt in opts"  ng-bind-html-unsafe="opt.text">
         opt.text 
    </li>
    </ul>

    <p>opt</p>
</div>

这行得通,无论如何你在使用unsanitized html 内容时应该非常小心,你应该真正信任内容的来源。

【讨论】:

【参考方案3】:

就像ng-bind-html-unsafe="opt.text":

<div ng-app ng-controller="MyCtrl">
    <ul>
    <li ng-repeat=" opt in opts" ng-bind-html-unsafe="opt.text" >
         opt.text 
    </li>
    </ul>

    <p>opt</p>
</div>

http://jsfiddle.net/gFFBa/3/

或者你可以在范围内定义一个函数:

 $scope.getContent = function(obj)
     return obj.value + " " + obj.text;
 

并以这种方式使用它:

<li ng-repeat=" opt in opts" ng-bind-html-unsafe="getContent(opt)" >
      opt.value 
</li>

http://jsfiddle.net/gFFBa/4/

请注意,您不能使用option 标签:Can I use HTML tags in the options for select elements?

【讨论】:

你如何在表达式中分隔属性,我想通过逗号分隔的列表或数组([])但它只显示第一个。例如 ng-bind-html-unsafe="opt.text, opt.value" 这在 Angular 1.2 中仍然有效吗?我注意到小提琴正在使用 1.0 html-bind-unsafe 自 1.2 起已被删除 @see link【参考方案4】:

使用ng-bind-html-unsafe

它将应用带有如下文本的html:

    <li ng-repeat=" opt in opts" ng-bind-html-unsafe="opt.text" >
         opt.text 
    </li>

【讨论】:

【参考方案5】:

请注意,rc 1.2 不再支持 ng-bind-html-unsafe。请改用 ng-bind-html。见:With ng-bind-html-unsafe removed, how do I inject HTML?

【讨论】:

感谢您的跟进,因为这里几乎所有其他内容都已弃用。【参考方案6】:

ng-bind-html-unsafe 从 1.2 开始被弃用。目前正确答案应该是:

HTML 方面:(与接受的答案相同):

<div ng-app ng-controller="MyCtrl">
   <ul>
      <li ng-repeat=" opt in opts" ng-bind-html-unsafe="opt.text">
         opt.text 
      </li>
   </ul>

   <p>opt</p>
</div>

但在控制器端:

myApp.controller('myCtrl', ['$scope', '$sce', function($scope, $sce) 
// ...
   $scope.opts.map(function(opt)  
      opt = $sce.trustAsHtml(opt);
   );

【讨论】:

如果你打电话给$sce.trustAsHtml,你应该使用`ng-bind-html`【参考方案7】:

这是来自官方示例angular docs v1.5 的指令,显示了如何编译 html:

.directive('compileHtml', function ($compile) 
  return function (scope, element, attrs) 
    scope.$watch(
      function(scope) 
        return scope.$eval(attrs.compileHtml);
      ,
      function(value) 
        element.html(value);
        $compile(element.contents())(scope);
      
    );
  ;
);

用法:

<div compile-html="item.htmlString"></div>

它将 item.htmlString 属性作为 html 插入任何地方,例如

<li ng-repeat="item in itemList">
    <div compile-html="item.htmlString"></div>

【讨论】:

以上是关于angular.js ng-repeat 带有 html 内容的项目的主要内容,如果未能解决你的问题,请参考以下文章

ng-repeat中的Angular js条件类

Angular JS——将ng-repeat应用于异步添加到DOM的东西

如何通过Angular JS计算数组中过滤的数据? [复制]

如何在 angular.js 中解析 ng-repeat 中的 HTML [重复]

Angular.js ng-repeat 跨多个元素

angular.js > 如何在视图中获取内部 JSON 数据(使用 ng-repeat 指令)