我曾经能够用来ng-bind-html-unsafe
输出未经清理的代码(因为清理发生在服务器端)。
但现在这个选项不见了?我知道我可以使用$sce.trustAsHtml
,但是当 unsafe 如此易于使用时,将它添加到整个地方的 JavaScript 是一个巨大的痛苦。
我如何恢复不安全?
我曾经能够用来ng-bind-html-unsafe
输出未经清理的代码(因为清理发生在服务器端)。
但现在这个选项不见了?我知道我可以使用$sce.trustAsHtml
,但是当 unsafe 如此易于使用时,将它添加到整个地方的 JavaScript 是一个巨大的痛苦。
我如何恢复不安全?
又简单了。
App.filter('unsafe', ['$sce', function ($sce) {
return function (val) {
return $sce.trustAsHtml(val);
};
}]);
用法:
<any ng-bind-html="content | unsafe"></any>
有关 html 绑定的更多信息,请查看此处的文档。
只是一个警告:确保您确实信任 html,否则您可能会在您的网站安全性中打开一个漏洞。
好吧,创建自己的指令非常简单,这是一个示例。
指令:
app.directive('bindHtmlUnsafe', function( $compile ) {
return function( $scope, $element, $attrs ) {
var compile = function( newHTML ) { // Create re-useable compile function
newHTML = $compile(newHTML)($scope); // Compile html
$element.html('').append(newHTML); // Clear and append it
};
var htmlName = $attrs.bindHtmlUnsafe; // Get the name of the variable
// Where the HTML is stored
$scope.$watch(htmlName, function( newHTML ) { // Watch for changes to
// the HTML
if(!newHTML) return;
compile(newHTML); // Compile it
});
};
});
用法:
<div bind-html-unsafe="testHTML"></div>
演示:http: //jsfiddle.net/cC5VZ/2
最简单的方法,没有 $sce:
module.directive('html', function() {
function link(scope, element, attrs) {
var update = function() {
element.html(scope.html);
}
attrs.$observe('html', function(value) {
update();
});
}
return {
link: link,
scope: {
html: '='
}
};
});
如何使用:
<div html="angular.variable"></div>
我强烈建议您查看这个简单的 JSFiddle 示例。是救生员:
<div ng-app="ngBindHtmlExample">
<div ng-controller="ngBindHtmlCtrl">
<p ng-bind-html="myHTML" compile-template></p>
</div>
</div>
var app = angular.module('app', []);
app.controller('testApp', function( $scope ) {
$scope.testHTML = '<h1> Welcome :) </h1>';
});
app.directive('bindHtmlUnsafe', function( $parse, $compile ) {
return function( $scope, $element, $attrs ) {
var compile = function( newHTML ) {
newHTML = $compile(newHTML)($scope);
$element.html('').append(newHTML);
};
var htmlName = $attrs.bindHtmlUnsafe;
$scope.$watch(htmlName, function( newHTML ) {
if(!newHTML) return;
compile(newHTML);
});
};
});