8

Вставка HTML в представление из контроллера AngularJS

1

Вопрос:

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

Ситуация заключается в том, что у меня есть задача преобразовать несогласованный объект JSON в вложенный список пар id: значение. В связи с этим HTML формируется в контроллере, и я теперь ищу способ его отобразить.

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


Обновление

Похоже, проблема возникает из-за того, что Angular рендерит созданный 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>

5 ответ(ов)

3

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

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

0

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

Сначала необходимо подключить модуль sanitizer после 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 is the answer.

0

Вы можете использовать следующий код, чтобы отобразить HTML-контент в AngularJS:

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

Однако стоит отметить, что ng-bind-html-unsafe устарел и больше не рекомендуется к использованию из соображений безопасности. Вместо этого рекомендуется использовать ng-bind-html вместе с модулем ngSanitize, который позволяет безопасно обрабатывать HTML-контент.

Вот пример, как это сделать:

  1. Убедитесь, что вы подключили модуль ngSanitize в вашем приложении:
angular.module('myApp', ['ngSanitize']);
  1. Затем используйте ng-bind-html:
<div ng-bind-html="expression"></div>

Не забудьте импортировать скрипт angular-sanitize.js в ваш проект. Это обеспечит безопасность и предотвратит XSS-атаки.

Надеюсь, это поможет!

0

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

Вот самый простой способ:

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

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

И в вашем представлении:

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

P.S. Этот метод не требует подключения модуля ngSanitize.

0

В вашем вопросе вы рассматриваете два варианта использования AngularJS для безопасного отображения HTML в вашем приложении. Ниже приведены пояснения к каждому из них.

  1. Использование ng-bind-html-unsafe:
<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>

Этот способ устарел и не рекомендуется к использованию, так как он может представлять угрозу безопасности, позволяя внедрение вредоносного кода. В современных версиях AngularJS вы должны избегать использования ng-bind-html-unsafe.

  1. Использование ng-bind-html:
<div ng-bind-html="myCtrl.comment.msg"></div>

Этот способ является предпочтительным, так как он предоставляет безопасный способ отображения HTML. Он требует, чтобы вы использовали $sce (Strict Contextual Escaping) для доверия контенту HTML.

В контроллере вы точно правильно используете $sce для доверия к HTML:

mySceApp.controller("myAppController", function myAppController($sce) {
    this.comment = {
        msg: $sce.trustAsHtml(html) // html – это ваша строка, содержащая HTML.
    };
});

Либо можете использовать $scope, как вы упомянули:

$scope.comment = {
    msg: $sce.trustAsHtml(html)
};

В обоих случаях код корректно обрабатывает HTML и позволяет безопасно отображать его в представлении. Запомните, что при работе с HTML нужно всегда заботиться о безопасности, избегая потенциальных уязвимостей, связанных с XSS (межсайтовым скриптингом).

Таким образом, используйте ng-bind-html с trustAsHtml для безопасного отображения HTML-контента.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь