Вставка HTML в представление из контроллера AngularJS
Вопрос:
Возможно ли создать фрагмент 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 ответ(ов)
Вы также можете создать фильтр следующим образом:
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, если в него передаются переменные с пользовательским вводом.
К счастью, вам не нужны сложные фильтры или небезопасные методы, чтобы избежать этого сообщения об ошибке. Вот полная реализация правильного вывода 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.
Вы можете использовать следующий код, чтобы отобразить HTML-контент в AngularJS:
<div ng-bind-html-unsafe="expression"></div>
Однако стоит отметить, что ng-bind-html-unsafe
устарел и больше не рекомендуется к использованию из соображений безопасности. Вместо этого рекомендуется использовать ng-bind-html
вместе с модулем ngSanitize
, который позволяет безопасно обрабатывать HTML-контент.
Вот пример, как это сделать:
- Убедитесь, что вы подключили модуль
ngSanitize
в вашем приложении:
angular.module('myApp', ['ngSanitize']);
- Затем используйте
ng-bind-html
:
<div ng-bind-html="expression"></div>
Не забудьте импортировать скрипт angular-sanitize.js
в ваш проект. Это обеспечит безопасность и предотвратит XSS-атаки.
Надеюсь, это поможет!
ng-bind-html-unsafe
больше не работает.
Вот самый простой способ:
Создайте фильтр:
myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
И в вашем представлении:
<div ng-bind-html="customHtml | unsafe"></div>
P.S. Этот метод не требует подключения модуля ngSanitize
.
В вашем вопросе вы рассматриваете два варианта использования AngularJS для безопасного отображения HTML в вашем приложении. Ниже приведены пояснения к каждому из них.
- Использование
ng-bind-html-unsafe
:
<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>
Этот способ устарел и не рекомендуется к использованию, так как он может представлять угрозу безопасности, позволяя внедрение вредоносного кода. В современных версиях AngularJS вы должны избегать использования ng-bind-html-unsafe
.
- Использование
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-контента.
В чем разница между angular-route и angular-ui-router?
Работа с $scope.$emit и $scope.$on в AngularJS
В чем разница между String.slice и String.substring?
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"