Вставьте HTML в вид из контроллера AngularJS - PullRequest
778 голосов
/ 21 февраля 2012

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

Это связано с требованием превратить несогласованный большой двоичный объект 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>

Ответы [ 18 ]

1099 голосов
/ 10 июня 2012

Для 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'])

309 голосов
/ 26 августа 2014

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

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, если ему передаются переменные с пользовательским вводом.

116 голосов
/ 25 марта 2014

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>
63 голосов
/ 16 октября 2014

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

Модуль очистки должен быть включен после 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 - это ответ .

61 голосов
/ 25 июля 2012

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

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

52 голосов
/ 23 августа 2015

ng-bind-html-unsafe больше не работает.

Это кратчайший путь:

Создать фильтр:

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

И по вашему мнению:

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

PS Этот метод не требует включения модуля ngSanitize.

25 голосов
/ 17 декабря 2013

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

9 голосов
/ 23 сентября 2014

Я обнаружил, что использование 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>

Удачи.

6 голосов
/ 19 марта 2015

Только что сделал это, используя ngBindHtml, выполнив angular (v1.4) docs ,

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

Убедитесь, что вы включили ngSanitize в зависимости модуля. Тогда все должно работать нормально.

4 голосов
/ 01 октября 2014

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

...