Javascript 从AngularJS控制器向视图中插入HTML
是否可以在AngularJS控制器中创建HTML片段,并在视图中显示此HTML 这是因为需要将不一致的JSON blob转换为Javascript 从AngularJS控制器向视图中插入HTML,javascript,angularjs,escaping,html-sanitizing,Javascript,Angularjs,Escaping,Html Sanitizing,是否可以在AngularJS控制器中创建HTML片段,并在视图中显示此HTML 这是因为需要将不一致的JSON blob转换为id:value对的嵌套列表。因此,在控制器中创建了HTML,我现在希望显示它 我已经创建了一个模型属性,但是如果不打印HTML,就无法在视图中呈现该属性 更新 问题似乎源于将创建的HTML以带引号的字符串形式呈现。将试图找到一种解决方法 控制器示例: var SomeController = function () { this.customHtml = '
id:value
对的嵌套列表。因此,在控制器中创建了HTML,我现在希望显示它
我已经创建了一个模型属性,但是如果不打印HTML,就无法在视图中呈现该属性
更新 问题似乎源于将创建的HTML以带引号的字符串形式呈现。将试图找到一种解决方法 控制器示例:
var SomeController = function () {
this.customHtml = '<ul><li>render me please</li></ul>';
}
var SomeController=函数(){
this.customHtml='- 请呈现给我;
}
示例视图:
<div ng:bind="customHtml"></div>
给出:
<div>
"<ul><li>render me please</li></ul>"
</div>
“- 请给我讲讲
”
对于Angular 1.x,在html中使用ng bind html
:
<div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>
<htmldiv content="theContent"></htmldiv>
消毒
有两个步骤:
<script src="lib/angular/angular-sanitize.min.js"></script>
我今天试过了,唯一的办法就是这个 html上的
<div ng-controller="myAppController as myCtrl">
<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>
还可与$scope.comment.msg=$sce.trustAsHtml(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>';
}]);
angular.module('MyModule').controller('MyController',['$scope','$http','$sce',',
函数($scope、$http、$sce){
$scope.renderHtml=函数(htmlCode){
返回$sce.trustAsHtml(htmlCode);
};
$scope.body='';
}]);
HTML文件:
<div ng-controller="MyController">
<div ng-bind-html="renderHtml(body)"></div>
</div>
您还可以创建如下过滤器:
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漏洞。我发现使用ng sanitize不允许我在html中添加ng click
为了解决这个问题,我添加了一个指令。像这样:
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:
<div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>
<htmldiv content="theContent"></htmldiv>
祝你好运。另一个解决方案与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>
注意:您可以将元素.append()
替换为元素.replaceWith()
幸运的是,您不需要任何花哨的过滤器或不安全的方法来避免该错误消息。这是以预期和安全的方式在视图中正确输出HTML标记的完整实现
消毒模块必须包含在以下各项之后:
<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>
这将允许您在控制器、指令等的字符串中包含标记:
scope.message = "<strong>42</strong> is the <em>answer</em>.";
scope.message=“42是答案。”;
最后,在模板中,必须按如下方式输出:
<p ng-bind-html="message"></p>
这将产生预期的输出:42是答案。您也可以使用ng include
<div class="col-sm-9 TabContent_container" ng-include="template/custom.html">
</div>
您可以使用“ng show”来显示和隐藏此模板数据。通过在angular中创建新的属性或指令,还有一个解决此问题的方法
产品规格.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>
规格
-
闪耀
:{{product.shine}
-
面
:{{product.faces}
-
稀有性
:{{产品.稀有性}
-
颜色
:{{product.color}
app.js
(函数(){
var app=angular.module('gemStore',[]);
app.directive(“”,function(){
返回{
限制:'E',
templateUrl:“产品规格.html”
};
});
index.html
//它将在此处加载product-specs.html文件。
或
//它将添加product-specs.html文件
或
只是通过以下方式使用ngBindHtml实现了这一点:
表达式可以是“- 请呈现给我”
确保在模块的依赖项中包含ngSanitize。
然后它就可以正常工作了。ng bind html unsafe
不再工作了
这是最短的路:
创建筛选器:
myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
<div ng-bind-html="customHtml | unsafe"></div>
在您看来:
myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
<div ng-bind-html="customHtml | unsafe"></div>
另外,此方法不要求您包括ngSanitize
模块。使用
<div ng-bind-html="customHtml"></div>
为此,您需要包括angular sanitize.js
,
例如,在html文件中使用
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-sanitize.js"></script>
这里有一个简单(且不安全)的绑定为html
指令,无需ngSanitize
:
myModule.directive('bindAsHtml', function () {
return {
link: function (scope, element, attributes) {
element.html(scope.$eval(attributes.bindAsHtml));
}
};
});
请注意,如果绑定不受信任的内容,这将导致安全问题。
像这样使用:
<div bind-as-html="someHtmlInScope"></div>
这是一个解决方案,制作一个这样的过滤器
.filter('trusted',
function($sce) {
return function(ss) {
return $sce.trustAsHtml(ss)
};
}
)
并将其作为筛选器应用于ng绑定html,如
<div ng-bind-html="code | trusted">
感谢Ruben Decrop使用管道的工作示例,它可以在带有Angular 4的模板中显示html
1.板条箱管道逃生-html.Pipe.ts
`
`
2.将管道注册到app.module.ts
import {EscapeHtmlPipe} from './components/pipes/escape-html.pipe';
declarations: [...,EscapeHtmlPipe]
在模板中使用
只需简单使用[innerHTML]
,如下所示:
<div [innerHTML]="htmlString"></div>
在您需要使用ng bind html
…之前,仅当源代码可信以避免跨站点脚本攻击时,才应使用此解决方案。从Angular 1.0.2开始,此解决方案适用于我,无需其他文件或连接。使用
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-sanitize.js"></script>
myModule.directive('bindAsHtml', function () {
return {
link: function (scope, element, attributes) {
element.html(scope.$eval(attributes.bindAsHtml));
}
};
});
<div bind-as-html="someHtmlInScope"></div>
.filter('trusted',
function($sce) {
return function(ss) {
return $sce.trustAsHtml(ss)
};
}
)
<div ng-bind-html="code | trusted">
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);
}
}
import {EscapeHtmlPipe} from './components/pipes/escape-html.pipe';
declarations: [...,EscapeHtmlPipe]
<div [innerHTML]="htmlString"></div>