Вставьте HTML в представление

javascript angularjs escaping html-sanitizing

620924 просмотра

18 ответа

Можно ли создать фрагмент HTML в контроллере AngularJS и показать этот HTML в виде?

Это связано с требованием превратить несовместимый BLOB-объект JSON во вложенный список 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 Источник Размещён: 17.05.2019 03:17

Ответы (18)


1085 плюса

Решение

Для 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

Есть 2 шага:

  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

304 плюса

Вы также можете создать фильтр следующим образом:

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

116 плюса

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

63 плюса

К счастью, вам не нужны какие-то необычные фильтры или небезопасные методы, чтобы избежать этого сообщения об ошибке. Это полная реализация для правильного и безопасного вывода HTML-разметки в представлении.

Модуль sanitize должен быть включен после Angular:

<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

61 плюса

Я попробовал сегодня, единственный способ, которым я нашел это

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

Автор: Damax Размещён: 24.07.2012 10:49

51 плюса

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

25 плюса

на 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

16 плюса

Начиная с Angular 4, теперь работает так:

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

Взято из этого вопроса здесь.

Автор: Garth Размещён: 09.06.2017 12:47

9 плюса

Я обнаружил, что использование ng-sanitize не позволяет мне добавлять ng-click в html.

Чтобы решить эту проблему, я добавил директиву. Как это:

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

6 плюса

Просто сделал это с помощью ngBindHtml, следуя угловым (v1.4) документам ,

<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

4 плюса

Другое решение, очень похожее на 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

3 плюса

есть еще одно решение этой проблемы, использующее создание нового атрибута или директив в angular.

продукт-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

3 плюса

Вы также можете использовать ng-include .

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

Вы можете использовать «ng-show», чтобы скрыть данные этого шаблона.

Автор: Vikash Sharma Размещён: 17.10.2014 06:32

1 плюс

использование

<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

1 плюс

вот решение сделать фильтр как этот

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

и применить это как фильтр к ng-bind-html, как

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

и спасибо Рубену Декропу

Автор: bahri noredine Размещён: 27.12.2017 11:29

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

0 плюса

Просто простое использование [innerHTML], как показано ниже:

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

Прежде чем вам нужно было использовать ng-bind-html...

Автор: Alireza Размещён: 31.01.2019 09:44

-1 плюса

Рабочий пример с конвейером для отображения html в шаблоне с Angular 4.

1.Crated Труба 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}

    Пожалуйста, добавьте соответствующую реализацию для getDivHtml в связанный файл component.ts.

Автор: Sagar Misal Размещён: 16.01.2018 09:24
Вопросы из категории :
32x32