将HTML插入视图

javascript angularjs escaping html-sanitizing

620924 观看

18回复

8229 作者的声誉

是否可以在AngularJS控制器中创建HTML片段并在视图中显示此HTML?

这需要将不一致的JSON blob转换为嵌套的id : value对列表。因此,HTML是在控制器中创建的,我现在希望显示它。

我创建了一个模型属性,但是如果不打印HTML,则无法在视图中呈现它。


更新

似乎问题来自角度渲染创建的HTML作为引号内的字符串。将试图找到解决这个问题的方法。

示例控制器:

var SomeController = function () {

    this.customHtml = '<ul><li>render me please</li></ul>';
}

示例视图:

<div ng:bind="customHtml"></div>

给:

<div>
    "<ul><li>render me please</li></ul>"
</div>
作者: Swaff 的来源 发布者: 2012 年 2 月 21 日

回应 (18)


1085

10942 作者的声誉

决定

对于Angular 1.x,请ng-bind-html在HTML中使用:

<div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>

此时您将收到attempting to use an unsafe value in a safe context错误,因此您需要使用ngSanitize$ sce来解决此问题。

$ SCE

使用$sce.trustAsHtml()控制器的HTML字符串转换。

 $scope.thisCanBeusedInsideNgBindHtml = $sce.trustAsHtml(someHtmlVar);

ngSanitize

有两个步骤:

  1. 包括angular-sanitize.min.js资源,即:
    <script src="lib/angular/angular-sanitize.min.js"></script>

  2. 在js文件(控制器或通常是app.js)中,包含ngSanitize,即:
    angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])

作者: Luke Madera 发布者: 10.06.2012 07:39

61

735 作者的声誉

我今天试过,我找到的唯一方法就是这个

<div ng-bind-html-unsafe="expression"></div>

作者: Damax 发布者: 24.07.2012 10:49

25

261 作者的声誉

在HTML上

<div ng-controller="myAppController as myCtrl">

<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>

要么

<div ng-bind-html="myCtrl.comment.msg"></div

在控制器上

mySceApp.controller("myAppController", function myAppController( $sce) {

this.myCtrl.comment.msg = $sce.trustAsHtml(html);

也适用于 $scope.comment.msg = $sce.trustAsHtml(html);

作者: Sotos 发布者: 17.12.2013 05:20

116

1570 作者的声誉

Angular JS在标记内显示HTML

上面链接中提供的解决方案对我有用,这个线程没有任何选项。对于任何使用AngularJS版本1.2.9寻找相同内容的人

这是一份副本:

好的,我找到了解决方案:

JS:

$scope.renderHtml = function(html_code)
{
    return $sce.trustAsHtml(html_code);
};

HTML:

<p ng-bind-html="renderHtml(value.button)"></p>

编辑:

这是设置:

JS档案:

angular.module('MyModule').controller('MyController', ['$scope', '$http', '$sce',
    function ($scope, $http, $sce) {
        $scope.renderHtml = function (htmlCode) {
            return $sce.trustAsHtml(htmlCode);
        };

        $scope.body = '<div style="width:200px; height:200px; border:1px solid blue;"></div>'; 

    }]);

HTML文件:

<div ng-controller="MyController">
    <div ng-bind-html="renderHtml(body)"></div>
</div>
作者: anpatel 发布者: 25.03.2014 04:25

304

3049 作者的声誉

你也可以像这样创建一个过滤器:

var app = angular.module("demoApp", ['ngResource']);

app.filter("trust", ['$sce', function($sce) {
  return function(htmlCode){
    return $sce.trustAsHtml(htmlCode);
  }
}]);

然后在视图中

<div ng-bind-html="trusted_html_variable | trust"></div>

注意:此过滤器信任传递给它的任何和所有html,并且如果将带有用户输入的变量传递给它,则可能会出现XSS漏洞。

作者: Katie Astrauskas 发布者: 26.08.2014 06:52

9

12879 作者的声誉

我发现使用ng-sanitize不允许我在html中添加ng-click。

为了解决这个问题我添加了一个指令 像这样:

app.directive('htmldiv', function($compile, $parse) {
return {
  restrict: 'E',
  link: function(scope, element, attr) {
    scope.$watch(attr.content, function() {
      element.html($parse(attr.content)(scope));
      $compile(element.contents())(scope);
    }, true);
  }
}
});

这是HTML:

<htmldiv content="theContent"></htmldiv>

祝好运。

作者: Matt 发布者: 22.09.2014 09:34

4

1074 作者的声誉

另一种解决方案,与blrbr非常相似,只是使用scoped属性是:

angular.module('app')
.directive('renderHtml', ['$compile', function ($compile) {
    return {
      restrict: 'E',
      scope: {
        html: '='
      },
      link: function postLink(scope, element, attrs) {

          function appendHtml() {
              if(scope.html) {
                  var newElement = angular.element(scope.html);
                  $compile(newElement)(scope);
                  element.append(newElement);
              }
          }

          scope.$watch(function() { return scope.html }, appendHtml);
      }
    };
  }]);

然后

<render-html html="htmlAsString"></render-html>

请注意,您可以替换element.append()element.replaceWith()

作者: ansielf 发布者: 01.10.2014 03:12

63

9954 作者的声誉

幸运的是,您不需要任何花哨的过滤器或不安全的方法来避免该错误消息。这是以预期和安全的方式在视图中正确输出HTML标记的完整实现。

必须在Angular之后包含sanitize模块:

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular-sanitize.js"></script>

然后,必须加载模块:

angular.module('app', [
  'ngSanitize'
]);

这将允许您在控制器,指令等的字符串中包含标记:

scope.message = "<strong>42</strong> is the <em>answer</em>.";

最后,在模板中,它必须像这样输出:

<p ng-bind-html="message"></p>

这将产生预期的输出:42答案

作者: Pier-Luc Gendreau 发布者: 16.10.2014 06:32

3

119 作者的声誉

你也可以使用ng-include

<div class="col-sm-9 TabContent_container" ng-include="template/custom.html">
</div>

您可以使用“ng-show”来显示隐藏此模板数据。

作者: Vikash Sharma 发布者: 17.10.2014 06:32

3

637 作者的声誉

使用角度创建新属性或指令,还有一个解决此问题的方法。

产品specs.html

 <h4>Specs</h4>
        <ul class="list-unstyled">
          <li>
            <strong>Shine</strong>
            : {{product.shine}}</li>
          <li>
            <strong>Faces</strong>
            : {{product.faces}}</li>
          <li>
            <strong>Rarity</strong>
            : {{product.rarity}}</li>
          <li>
            <strong>Color</strong>
            : {{product.color}}</li>
        </ul>

app.js

 (function() {
var app = angular.module('gemStore', []);    
app.directive("     <div ng-show="tab.isSet(2)" product-specs>", function() {
return {
  restrict: 'E',
  templateUrl: "product-specs.html"
};
});

的index.html

 <div>
 <product-specs>  </product-specs>//it will load product-specs.html file here.
 </div>

要么

<div  product-specs>//it will add product-specs.html file 

要么

<div ng-include="product-description.html"></div>

https://docs.angularjs.org/guide/directive

作者: yugi 发布者: 18.11.2014 05:47

6

2152 作者的声誉

刚刚通过遵循angular(v1.4)文档使用ngBindHtml做到了这一点,

<div ng-bind-html="expression"></div> 
and expression can be "<ul><li>render me please</li></ul>"

确保在模块的依赖项中包含ngSanitize。那它应该工作正常。

作者: Henry Neo 发布者: 19.03.2015 02:41

51

865 作者的声誉

ng-bind-html-unsafe 不再有效。

这是最短的方式:

创建一个过滤器:

myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });

在你看来:

<div ng-bind-html="customHtml | unsafe"></div>

PS此方法不要求您包含该ngSanitize模块。

作者: Bidhan Bhattarai 发布者: 23.08.2015 02:45

1

2062 作者的声誉

使用

<div ng-bind-html="customHtml"></div>

angular.module('MyApp', ['ngSanitize']);

为此,您需要包含angular-sanitize.js,例如在您的html文件中

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-sanitize.js"></script>
作者: Patricia Beier 发布者: 22.10.2016 11:51

16

476 作者的声誉

从Angular 4开始,这就是现在的工作方式:

<div [innerHTML]="htmlString">
</div>

从这里提出这个问题

作者: Garth 发布者: 09.06.2017 12:47

0

0 作者的声誉

这是一个简单(和不安全)的bind-as-html指令,不需要ngSanitize

myModule.directive('bindAsHtml', function () {
    return {
        link: function (scope, element, attributes) {
            element.html(scope.$eval(attributes.bindAsHtml));
        }
    };
});

请注意,如果绑定不受信任的内容,这将打开安全问题。

使用如下:

<div bind-as-html="someHtmlInScope"></div>
作者: user3638471 发布者: 26.12.2017 03:10

1

26 作者的声誉

这是解决方案制作这样的过滤器

.filter('trusted',
   function($sce) {
     return function(ss) {
       return $sce.trustAsHtml(ss)
     };
   }
)

并将其作为过滤器应用于ng-bind-html之类的

<div ng-bind-html="code | trusted">

并感谢Ruben Decrop

作者: bahri noredine 发布者: 27.12.2017 11:29

-1

40 作者的声誉

使用管道的工作示例使用Angular 4在模板中显示html。

1.Crated Pipe escape-html.pipe.ts

`

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Pipe({name : 'keepHtml', pure : false})
export class EscapeHtmlPipe implements PipeTransform{
 constructor(private sanitizer : DomSanitizer){
 }
 transform(content){
  return this.sanitizer.bypassSecurityTrustHtml(content);
 }
}

`2.将管道注册到app.module.ts

 import {EscapeHtmlPipe} from './components/pipes/escape-html.pipe';
    declarations: [...,EscapeHtmlPipe]
  1. 在模板中使用

        <div class="demoPipe"  [innerHtml]="getDivHtml(obj.header) | keepHtml">

  2. getDivHtml() { //can return html as per requirement}

    请在关联的component.ts文件中添加适当的getDivHtml实现。

作者: Sagar Misal 发布者: 16.01.2018 09:24

0

47716 作者的声誉

只需简单使用[innerHTML],如下所示:

<div [innerHTML]="htmlString"></div>

在您需要使用之前ng-bind-html......

作者: Alireza 发布者: 31.01.2019 09:44
32x32