Вставьте HTML в вид из контроллера AngularJS
Возможно ли создать фрагмент HTML в контроллере AngularJS и отобразить этот HTML в представлении?
Это связано с требованием превратить несогласованный BLOB-код в вложенный список пар id : value
. Поэтому HTML создается в контроллере, и теперь я хочу его отобразить.
Я создал свойство модели, но не могу сделать это в представлении без его просто печати HTML.
Update
Похоже, что проблема возникает из 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>
Ответы
Ответ 1
Для 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
Есть два шага:
-
включают ресурс angular -sanitize.min.js, т.е.:
<script src="lib/angular/angular-sanitize.min.js"></script>
-
В файле js (контроллер или обычно app.js) включите ngSanitize, т.е.:
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])
Ответ 2
Вы также можете создать такой фильтр:
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, если к нему передаются переменные с пользовательским вводом.
Ответ 3
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>
EDIT:
Здесь настроено:
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>
Ответ 4
К счастью, вам не нужны какие-либо причудливые фильтры или небезопасные методы, чтобы избежать этого сообщения об ошибке. Это полная реализация для корректного вывода разметки 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 - ответ.
Ответ 5
Я пробовал сегодня, единственный способ найти это
<div ng-bind-html-unsafe="expression"></div>
Ответ 6
ng-bind-html-unsafe
больше не работает.
Это самый короткий путь:
Создать фильтр:
myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
И на ваш взгляд:
<div ng-bind-html="customHtml | unsafe"></div>
P.S. Этот метод не требует включения модуля ngSanitize
.
Ответ 7
на 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);
Ответ 8
Начиная с Angular 4, теперь работает так:
<div [innerHTML]="htmlString">
</div>
Взято из этого вопроса: угловое связывание HTML
Ответ 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>
Удачи.
Ответ 10
Просто сделал это с помощью ngBindHtml, выполнив angular (v1.4) docs,
<div ng-bind-html="expression"></div>
and expression can be "<ul><li>render me please</li></ul>"
Убедитесь, что вы включили ngSanitize в зависимости от модуля.
Тогда он должен работать нормально.
Ответ 11
Другое решение, очень похожее на 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()
Ответ 12
вы также можете использовать ng-include.
<div class="col-sm-9 TabContent_container" ng-include="template/custom.html">
</div>
вы можете использовать "ng-show" , чтобы показать скрытые данные этого шаблона.
Ответ 13
для решения этой проблемы есть еще одно решение, использующее новый атрибут или директивы в angular.
product-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
Ответ 14
См. ответы, которые я разместил для вас в этих двух местах:
http://forum.ionicframework.com/t/eval-json-data-as-html/1455/6
http://codepen.io/calendee/pen/DKhbc
Ответ 15
Использование
<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>
Ответ 16
вот решение сделать фильтр, подобный этому
.filter('trusted',
function($sce) {
return function(ss) {
return $sce.trustAsHtml(ss)
};
}
)
и примените это как фильтр к ng-bind-html, как
<div ng-bind-html="code | trusted">
и спасибо Рубену Decrop
Ответ 17
Здесь простая (и небезопасная) директива 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>
Ответ 18
Рабочий пример с трубкой для отображения html в шаблоне с угловым 4.
1.Crated Pipe 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]
-
Использовать в шаблоне
<div class="demoPipe" [innerHtml]="getDivHtml(obj.header) | keepHtml">
Ответ 19
Просто используйте [innerHTML]
, как [innerHTML]
ниже:
<div [innerHTML]="htmlString"></div>
Прежде чем вам нужно было использовать ng-bind-html
...
Ответ 20
В Angular 7 + ionic 4 содержимое Html может быть показано с помощью "[innerHTML]":
<div [innerHTML]="htmlContent"></div>
Я надеюсь, это также поможет вам. Благодарю.