是否可以在AngularJS控制器中创建一个HTML片段,并在视图中显示该HTML?
这是因为需要将不一致的JSON blob转换为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>
在html上
<div ng-controller="myAppController as myCtrl">
<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>
OR
<div ng-bind-html="myCtrl.comment.msg"></div
控制器上
mySceApp.controller("myAppController", function myAppController( $sce) {
this.myCtrl.comment.msg = $sce.trustAsHtml(html);
也适用于$scope.coment.msg=$sce.trustAsHtml(html);
另一个与blrbr非常相似的解决方案是:
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.replaceWith()替换element.append()
您也可以创建如下过滤器:
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上
<div ng-controller="myAppController as myCtrl">
<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>
OR
<div ng-bind-html="myCtrl.comment.msg"></div
控制器上
mySceApp.controller("myAppController", function myAppController( $sce) {
this.myCtrl.comment.msg = $sce.trustAsHtml(html);
也适用于$scope.coment.msg=$sce.trustAsHtml(html);
我发现使用ng消毒液不允许我在html中添加ng点击。
为了解决这个问题,我添加了一个指令。这样地:
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>
祝你好运