看到一个angular封装指令的栗子。
js代码:
//sb变量建立在window对象上
var sb = {
name : "somebody",
gender : "male",
age : 28
};
angular.module("ezstuff",[])
.directive("ezNamecard",function(){
return {
restrict : "E",
template : "<div class='namecard'>",
replace : true,
link : function(scope,element,attrs){
//读取data属性值,获得变量名,通过eval得到其值
var sb = eval(attrs.data);
//填充DOM元素内容
element.append("<div>name : " + sb.name + "</div>")
.append("<div>gender : " + sb.gender + "</div>")
.append("<div>age : " + sb.age + "</div>")
}
};
});
css部分:
.namecard{
border : 1px solid #000;
border-radius : 10px;
padding:10px;
width:300px;
background:#f0f0f0;
}
HTML部分:
<html>
<head>
<script src="http://lib.sinaapp.com/js/angular.js/angular-1.2.19/angular.min.js"></script>
</head>
<body ng-app="ezstuff">
<!--使用data属性向指令实现代码传递变量名-->
<ez-namecard data="window.sb"></ez-namecard>
</body>
</html>
不过,请注意,前面定义的sb变量,默认是挂在window对象(命名空间)上的,即window.sb。 如果所有的数据都挂在window上,保不齐哪天就会出现变量的命名冲突。
AngularJS引入了一个自用的命名空间,也就是$rootScope对象,这样sb变量就可以 挂在$rootScope上了,即$rootScope.sb。
在HTML模板中,我们用了两个内置指令:
ng-app指令会在启动引导时创建一个$rootScope对象。
ng-init指令用来在作用域上初始化变量,这个指令将在$rootScope上建立sb对象。
在指令的实现代码中,与之前使用eval函数进行表达式估值不同,我们直接使用scope的$eval方法获 得sb变量的值。
你可能注意到,这个scope是link函数传入的参数,它和我们说的$rootScope是一个东西吗?
加入了作用域的directive:
JavaScript代码
angular.module("ezstuff",[])
.directive("ezNamecard",function(){
return {
restrict : "E",
template : "<div class='namecard'>",
replace : true,
link : function(scope,element,attrs){
var sb = scope.$eval(attrs.data);
element.append("<div>name : " + sb.name + "</div>")
.append("<div>gender : " + sb.gender + "</div>")
.append("<div>age : " + sb.age + "</div>")
}
};
});
CSS代码
.namecard{
border : 1px solid #000;
border-radius : 10px;
padding:10px;
width:300px;
background:#f0f0f0;
}
HTML代码
<html>
<head>
<script src="http://lib.sinaapp.com/js/angular.js/angular-1.2.19/angular.min.js"></script>
</head>
<!-- ng-app指令在body这个DOM对象上建立了$rootScope对象 -->
<body ng-app="ezstuff" ng-init="sb = {name:'somebody',gender:'male',age:28}">
<!-- 注意我们传入的变量名没加命名空间-->
<ez-namecard data="sb"></ez-namecard>
</body>
</html>
未完
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。