Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从AngularJS控制器向视图中插入HTML_Javascript_Angularjs_Escaping_Html Sanitizing - Fatal编程技术网

Javascript 从AngularJS控制器向视图中插入HTML

Javascript 从AngularJS控制器向视图中插入HTML,javascript,angularjs,escaping,html-sanitizing,Javascript,Angularjs,Escaping,Html Sanitizing,是否可以在AngularJS控制器中创建HTML片段,并在视图中显示此HTML 这是因为需要将不一致的JSON blob转换为id:value对的嵌套列表。因此,在控制器中创建了HTML,我现在希望显示它 我已经创建了一个模型属性,但是如果不打印HTML,就无法在视图中呈现该属性 更新 问题似乎源于将创建的HTML以带引号的字符串形式呈现。将试图找到一种解决方法 控制器示例: var SomeController = function () { this.customHtml = '

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

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

我已经创建了一个模型属性,但是如果不打印HTML,就无法在视图中呈现该属性


更新

问题似乎源于将创建的HTML以带引号的字符串形式呈现。将试图找到一种解决方法

控制器示例:

var SomeController = function () {

    this.customHtml = '<ul><li>render me please</li></ul>';
}
var SomeController=函数(){
this.customHtml='
  • 请呈现给我; }
示例视图:

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

给出:

<div>
    "<ul><li>render me please</li></ul>"
</div>
  • 请给我讲讲

对于Angular 1.x,在html中使用
ng bind html

<div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>
<htmldiv content="theContent"></htmldiv>
消毒 有两个步骤:

  • 包括angular-sanitize.min.js资源,即:

    <script src="lib/angular/angular-sanitize.min.js"></script>
    

  • 我今天试过了,唯一的办法就是这个

    html上的

    <div ng-controller="myAppController as myCtrl">
    
    <div ng-bind-html-unsafe="myCtrl.comment.msg"></div>
    
    还可与
    $scope.comment.msg=$sce.trustAsHtml(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>'; 
    
        }]);
    
    angular.module('MyModule').controller('MyController',['$scope','$http','$sce',',
    函数($scope、$http、$sce){
    $scope.renderHtml=函数(htmlCode){
    返回$sce.trustAsHtml(htmlCode);
    };
    $scope.body='';
    }]);
    
    HTML文件:

    <div ng-controller="MyController">
        <div ng-bind-html="renderHtml(body)"></div>
    </div>
    

    您还可以创建如下过滤器:

    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漏洞。

    我发现使用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:

    <div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>
    
    <htmldiv content="theContent"></htmldiv>
    
    
    

    祝你好运。

    另一个解决方案与blrbr非常相似,只是使用了作用域属性:

    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>
    
    
    

    注意:您可以将
    元素.append()
    替换为
    元素.replaceWith()
    幸运的是,您不需要任何花哨的过滤器或不安全的方法来避免该错误消息。这是以预期和安全的方式在视图中正确输出HTML标记的完整实现

    消毒模块必须包含在以下各项之后:

    <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>
    
    这将允许您在控制器、指令等的字符串中包含标记:

    scope.message = "<strong>42</strong> is the <em>answer</em>.";
    
    scope.message=“42是答案。”;
    
    最后,在模板中,必须按如下方式输出:

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

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

    您也可以使用ng include

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

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

    通过在angular中创建新的属性或指令,还有一个解决此问题的方法

    产品规格.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>
    
    规格
    
    • 闪耀 :{{product.shine}
    • :{{product.faces}
    • 稀有性 :{{产品.稀有性}
    • 颜色 :{{product.color}
    app.js

    (函数(){
    var app=angular.module('gemStore',[]);
    app.directive(“”,function(){
    返回{
    限制:'E',
    templateUrl:“产品规格.html”
    };
    });
    
    index.html

    
    //它将在此处加载product-specs.html文件。
    

    //它将添加product-specs.html文件
    

    
    

    只是通过以下方式使用ngBindHtml实现了这一点:

    
    表达式可以是“
    • 请呈现给我”
    确保在模块的依赖项中包含ngSanitize。
    然后它就可以正常工作了。

    ng bind html unsafe
    不再工作了

    这是最短的路:

    创建筛选器:

    myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
    
    <div ng-bind-html="customHtml | unsafe"></div>
    
    在您看来:

    myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
    
    <div ng-bind-html="customHtml | unsafe"></div>
    
    
    
    另外,此方法不要求您包括
    ngSanitize
    模块。

    使用

    <div ng-bind-html="customHtml"></div>
    
    为此,您需要包括
    angular sanitize.js
    , 例如,在html文件中使用

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-sanitize.js"></script>
    
    
    
    这里有一个简单(且不安全)的
    绑定为html
    指令,无需
    ngSanitize

    myModule.directive('bindAsHtml', function () {
        return {
            link: function (scope, element, attributes) {
                element.html(scope.$eval(attributes.bindAsHtml));
            }
        };
    });
    
    请注意,如果绑定不受信任的内容,这将导致安全问题。

    像这样使用:

    <div bind-as-html="someHtmlInScope"></div>
    

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

    .filter('trusted',
       function($sce) {
         return function(ss) {
           return $sce.trustAsHtml(ss)
         };
       }
    )
    
    并将其作为筛选器应用于ng绑定html,如

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

    感谢Ruben Decrop

    使用管道的工作示例,它可以在带有Angular 4的模板中显示html

    1.板条箱管道逃生-html.Pipe.ts

    `

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

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


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

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

    在您需要使用
    ng bind html

    之前,仅当源代码可信以避免跨站点脚本攻击时,才应使用此解决方案。从Angular 1.0.2开始,此解决方案适用于我,无需其他文件或连接。使用
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-sanitize.js"></script>
    
    myModule.directive('bindAsHtml', function () {
        return {
            link: function (scope, element, attributes) {
                element.html(scope.$eval(attributes.bindAsHtml));
            }
        };
    });
    
    <div bind-as-html="someHtmlInScope"></div>
    
    .filter('trusted',
       function($sce) {
         return function(ss) {
           return $sce.trustAsHtml(ss)
         };
       }
    )
    
    <div ng-bind-html="code | trusted">
    
    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);
     }
    }
    
     import {EscapeHtmlPipe} from './components/pipes/escape-html.pipe';
        declarations: [...,EscapeHtmlPipe]
    
    <div [innerHTML]="htmlString"></div>