Angular - - $sce 和 $sceDelegate
$sce
$sce 服务是AngularJs提供的一种严格上下文转义服务。
严格的上下文转义服务
严格的上下文转义(SCE)是一种需要在一定的语境中导致AngularJS绑定值被标记为安全使用语境的模式。由用户通过ng-bind-html绑定任意HTML语句就是这方面的一个例子。我们称这些上下文转义为特权或者SCE。
下面代码是简化了的ngBindHtml实现(当然,这不是完整版ngBindHtml源码):

var ngBindHtmlDirective = ['$sce', function($sce) {
return function(scope, element, attr) {
scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
element.html(value || '');
});
};
}];

支持哪些信任的上下文类型?
$sce.HTML 将HTML代码安全的绑定到应用程序中。
$sce.CSS 将CSS样式代码安全的绑定到应用程序中。
$sce.URL 将URL安全的绑定到应用程序中并保证其可用。比如(href,src)
$sce.RESOURCE_URL 将RESOURCE_URL安全的绑定到应用程序中并保证其可用。比如(ng-href,ng-src)
$sce.JS 将JAVASCRIPT代码安全的绑定到应用程序中。
如何使$sce服务可用或者不可用?
angular.module(“myApp”,[]).config([“$sceProvider”,function($sceProvider){
$sceProvider.enabled(true/false);
}]);
使用:$sce();
方法:
isEnabled();
返回一个boolean,指示是否可启用SCE。
parseAs(type,expression);
将Angular表达式转换为一个函数。这类似$parse解析并且当表达式是常量时是相同的。否则,它将调用$sce.getTrusted(type,result)将表达式包装。
type:在SCE的上下文的使用的结果的类型。
expression:被编译的字符串表达式。
trustAs(type,value);
代表$sceDelegate.trustAs。
type:上下文中能安全的被使用的值,如url,resourceUrl,html,js和css。
value:需要被认为是安全或者值的信赖的值。
trustAsHtml(value);
$sceDelegate.trustAs($sce.HTML,value)的快捷方式。
value:被信任的值。
trustAsUrl(value);
$sceDelegate.trustAs($sce.URL,value)的快捷方式。
value:被信任的值。
trustAsResourceUrl(value);
$sceDelegate.trustAs($sce.RESOURCE_URL,value)的快捷方式。
value:被信任的值。
trustAsJs(value);
$sceDelegate.trustAs($sce.JS,value)的快捷方式。
value:被信任的值。
getTrusted(type,maybeTrusted);
代表$sceDelegate.getTrusted。因此,得到了$sce的结果。如果查询的上下文类型是一个创造型的类型,则调用trustAs()并且返回原来提供的值。如果这个条件不满足,则抛出一个异常。
getTrustedHtml(value);
$sceDelegate.getTrusted ($sce.HTML,value)的快捷方式。
value:通过$sce.getTrusted执行后的值。
getTrustedCss(value);
$sceDelegate.getTrusted ($sce.CSS,value)的快捷方式。
value:通过$sce.getTrusted执行后的值。
getTrustedUrl(value);
$sceDelegate.getTrusted ($sce.URL,value)的快捷方式。
value:通过$sce.getTrusted执行后的值。
getTrustedResourceUrl(value);
$sceDelegate.getTrusted ($sce.RESOURCE_URL,value)的快捷方式。
value:通过$sce.getTrusted执行后的值。
getTrustedJs(value);
$sceDelegate.getTrusted ($sce.JS,value)的快捷方式。
value:通过$sce.getTrusted执行后的值。
parseAsHtml(expression);
$sce.parseAs ($sce.HTML,value)的快捷方式。
value:被编译的字符串表达式。
parseAsCss(expression);
$sce.parseAs ($sce.CSS,value)的快捷方式。
value:被编译的字符串表达式。
parseAsUrl(expression);
$sce.parseAs ($sce.URL,value)的快捷方式。
value:被编译的字符串表达式。
parseAsResourceUrl(expression);
$sce.parseAs ($sce.RESOURCE_URL,value)的快捷方式。
value:被编译的字符串表达式。
parseAsJs(expression);
$sce.parseAs ($sce.JS,value)的快捷方式。
value:被编译的字符串表达式。
使用方式:
<div ng-app="Demo" ng-controller="testCtrl as ctrl">
<textarea ng-model="ctrl.jsContext"></textarea>
<pre ng-bind="ctrl.jsBody"></pre>
<button ng-click="ctrl.runJs()">Run</button>
<div ng-bind-html="ctrl.htmlText" class="myCss"></div>
</div>

(function () {
angular.module('Demo', [])
.controller('testCtrl', ["$sce","$scope",testCtrl]);
function testCtrl($sce,$scope) {
var vm = this;
$scope.$watch("ctrl.jsContext",function(n){
vm.jsBody = n;
});
vm.runJs = function() {
eval(vm.jsBody.toString());
};
vm.htmlText = "<h2>Hello World</h2>";
vm.htmlText =$sce.trustAsHtml(vm.htmlText);
}
}());

放在filter使用:
<div ng-app="Demo" ng-controller="testCtrl as ctrl">
<div ng-bind-html="ctrl.htmlText | trust:'html'"></div>
</div>

(function () {
angular.module('Demo', [])
.filter("trust",["$sce",trust])
.controller('testCtrl', testCtrl);
function trust($sce){
return function(value,type){
return $sce.trustAs(type,value);
}
};
function testCtrl() {
var vm = this;
vm.htmlText = "<h2>Hello World</h2>";
}
}());

上面是一个将不被Angular认定为信任的HTML代码字符串通过$sce设置为信任的HTML代码并且插入的例子,这里用了个小技巧,也就没在 controller进行这步操作了,直接放到一个filter服务内,只要在需要的地方过滤下即可,并且可指定类型,这里写成统一动态选择类型了。那么 在啥时候需要用到这两个服务呢,答案是在当你绑定ng-bind-html时报错:Error: [$sce:unsafe]Attempting to use an unsafe value in a safe context. 的时候。哈哈~~~
$sceDelegate
$sceDelegate是一个AngularJs为$sce服务提供严格的上下文转义服务的服务。
通常,你会配置或者重写$sceDelegate去代替$sce服务以定制AngularJs中的严格的上下文转义机制。当$sce提供众多的快捷 方式,你其实只需要重写三个核心功能(trustAs,getTrusted和valueOf)来替代事件的工作方式,因为$sce代表 了$sceDelegate的这些操作。
当你完成了重写或配置$sceDelegate用来改变$sce的行为时,一般情况下,需要配置$sceDelegateProvider以代替你用于装载可信任的AngularJs资源(如template)的白名单和黑名单。
使用:$sceDelegate();
方法:
trustAs(type,value);
返回一个在angular中作为指定的使用严格的上下文转义服务上下文中的值的对象使用。
type:上下文中能安全的被使用的值,如url,resourceUrl,html,js和css。
value:需要被认为是安全或者值的信赖的值。
valueOf(value);
如果传递的参数被上一个$sceDelegate.trustAs调用返回,返回已通过$sceDelegate.trustAs的值。否则返回原先的值。
value:上一个$sceDelegate.trustAs调用的结果或者其他任何结果。
getTrusted(type,maybeTrusted);
如果查询的上下文类型是一个创造型的类型,得到$sceDelegate调用的结果并返回最初提供的值。如果这个条件不满意,抛出一个异常。
type:需要用到的值的类型。
value:上一个$sceDelegate.trustAs调用的结果或者其他任何结果。
使用代码(配置白名单/黑名单):
angular.module('myApp', []).config([“$ sceDelegateProvider”,function($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist([“whitelist value”]);
$sceDelegateProvider.resourceUrlBlacklist([“blacklist value”]);
}]);
写完睡觉 -。- 这篇准备了两天,在google找了些较详细的资料参考了下,然后写出大致的中文,再写demo,不过感觉这个相关的文章多是多,写的却都复制个源码, 注释2-3句就差不多,还不如实用些的来个demo,所以直接扔上来两串测过后运行成功的代码...
Angular - - $sce 和 $sceDelegate的更多相关文章
- AngularJs $sce 和 $sceDelegate 上下文转义
$sce $sce 服务是AngularJs提供的一种严格上下文转义服务. 严格的上下文转义服务 严格的上下文转义(SCE)是一种需要在一定的语境中导致AngularJS绑定值被标记为安全使用语境的模 ...
- angular源码分析:angular中入境检察官$sce
一.ng-bing-html指令问题 需求:我需要将一个变量$scope.x = '<a href="http://www.cnblogs.com/web2-developer/&qu ...
- AngularJS 使用$sce控制代码安全检查
由于浏览器都有同源加载策略,不能加载不同域下的文件.也不能使用不合要求的协议比如file进行访问. 在angularJs中为了避免安全漏洞,一些ng-src或者ng-include都会进行安全校验,因 ...
- 我的angularjs源码学习之旅3——脏检测与数据双向绑定
前言 为了后面描述方便,我们将保存模块的对象modules叫做模块缓存.我们跟踪的例子如下 <div ng-app="myApp" ng-controller='myCtrl ...
- AngularJS 源码分析1
AngularJS简介 angularjs 是google出品的一款MVVM前端框架,包含一个精简的类jquery库,创新的开发了以指令的方式来组件化前端开发,可以去它的官网看看,请戳这里 再贴上一个 ...
- angular源码分析:angular的整个加载流程
在前面,我们讲了angular的目录结构.JQLite以及依赖注入的实现,在这一期中我们将重点分析angular的整个框架的加载流程. 一.从源代码的编译顺序开始 下面是我们在目录结构哪一期理出的an ...
- Angular源代码学习笔记-原创
时间:2014年12月15日 14:15:10 /** * @license AngularJS v1.3.0-beta.15 * (c) 2010-2014 Google, Inc. http:// ...
- 在angular中利用分页插件进行分页
必需:angular分页js和css 当然还有angular.js 还需要bootstrap的css angular.min.js (下面我直接把插件粘贴上去了,以免有的同学还要去找.是不是很贴 ...
- Angularjs 源码
/** * @license AngularJS v1.3.0-beta.15 * (c) 2010-2014 Google, Inc. http://angularjs.org function t ...
随机推荐
- 基于JAVA语言的多线程技术
1.简介 多线程技术属于操作系统范围内的知识: 进程与线程 可以这么理解,一个应用程序就是一个进程,在一个进程中包含至少一个线程:进程就是线程的容器,真正工作.处理任务的是线程. 进程是操作系统分配资 ...
- mysql 查询 字段的类型
select column_name,data_type from information_schema.columnswhere table_name = '表名'
- css预处理器
Sass.LESS是什么?大家为什么要使用他们? 他们是CSS预处理器.他是CSS上的一种抽象层.他们是一种特殊的语法/语言编译成CSS. Less是一种动态样式语言. 将CSS赋予了动态语言的特 ...
- 细菌(disease)
细菌(disease) 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所 ...
- Recover Polygon (easy)
Recover Polygon (easy) The zombies are gathering in their secret lair! Heidi will strike hard to des ...
- Python 之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
一.Memcached Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负债.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...
- 用css、html编写一个两列布局的网页,名称为css.html ,要求左侧宽度为200px ,右侧自动扩展
<body><div style=" float:left; width:200px; height:300px; border: 1px #0033FF solid;&q ...
- CG之基本光照模型计算公式
在一个基本模型里,一个物体表面的颜色是由放射(emissive).环境反射(ambient).漫反射(diffuse)和镜面反射(specular)等光照作用的总和.每种光照作用取决于表面材质的性质( ...
- gtk
GTK官网:www.gtk.org sudo apt-get install build-essential 安装GTK开发套件: sudo apt-get install libgtk2.0-dev ...
- Java的JDBC事务详解
Java的JDBC事务详解 分类: Hibernate 2010-06-02 10:04 12298人阅读 评论(9) ...