是的,你可以关闭SCE,但这不会导致你的字符串被插入到HTML中
根据您的情况:
$scope.movie = {title:"<h1>Egghead.io AngularJS, Binding</h1>",
src:"http://www.youtube.com/embed/Lx7ycjC8qjE"};
直接插入标题而不使用ng-bind-html="movie.title"
进行插值
<p>{{movie.title}}</p>
将会生成这个
<h1>Egghead.io AngularJS Binding</h1>
直接插值似乎是经过消毒的,但实际上没有编译。
带有HTML的插值字符串被视为字符串,除非在指令中编译。
其他框架往往是“基于字符串”的(它们直接向浏览器提供数据),而AngularJS是“基于DOM”的,它会编译您的HTML并使用作用域和监控事件进行积极管理。马丁·福勒将此称为模板 查看与转换视图。
可以在指令中编译HTML,但只能在标记和控制器中插值
我创建了2个 Plunker 尝试访问“不安全的url”,这意味着我在ng-src
中插值了一个 url 而没有使用$sce.trustAs
演示1:Plunker 1SCE 在配置期间被禁用
标记插值“不安全的url”:
<p>{{movie.title}}</p>
<iframe class="youtube-player" type="text/html" width="640" height="385" ng-src="{{movie.src}}" allowfullscreen frameborder="0">
</iframe>
应用程序禁用了$sceProvider
var app = angular.module('plunker', ['ngSanitize']);
app.config(['$sceProvider',function($sceProvider){
$sceProvider.enabled(false);
}]);
app.controller('MainCtrl', function($scope, $sce) {
$scope.movie = {src:"http://www.youtube.com/embed/Lx7ycjC8qjE", title:"Egghead.io AngularJS Binding"};
});
“不安全”的URL被插值而不出错。视频被显示。
展示2:Plunker 2 app.config
已被注释掉,因此使用默认的SCE设置。
var app = angular.module('plunker', ['ngSanitize']);
app.controller('MainCtrl', function($scope, $sce) {
$scope.movie = {src:"http://www.youtube.com/embed/Lx7ycjC8qjE", title:"Egghead.io AngularJS Binding"};
});
错误:
错误: [$interpolate:interr] 无法插值: {{movie.src}} 错误:
[$sce:insecurl] 因不在 $sceDelegate 策略允许的 URL 中,阻止从 url 加载资源。 URL:http://www.youtube.com/embed/Lx7ycjC8qjE