Angular.js指令学习中一些重要属性的用法教程
发布时间 - 2026-01-11 01:16:07 点击率:次Angular指令

定义一个指令的方法非常简单,只需要调用`directive`方法即可:
var app=angular.module('myapp',[]);
app.directive(name,fn)
1. 基础指令
var app=angular.module('myapp',[]);
app.run(function($templateCache){
$templateCache.put('cache','<h3>模板内容来源于缓存</h3>')
});
app.directive('tsHello',function(){
return{
restrict:'EAC',
template:'<h3>Hello,directive</h3>'
}
})
app.directive('tsTplfile',function(){
return{
restrict:'EAC',
templateUrl:'/static/tpl.html'
}
});
app.directive('tsTplscript',function(){
return {
restrict:'EAC',
templateUrl:'tpl',
replace:true
}
});
//templateUrl属性值是添加的缓存名称,加速文件访问
app.directive('tsTplcache',function(){
return{
restrict:'EAC',
templateUrl:'cache'
}
})
</script>
2. 重要指令
2.1 transclude
<script type="text/ng-template" id='tpl'>
<div>
<input type="text" ng-model='text' />
<div ng-transclude></div>
</div>
</script>
<ts-tplscript>{{text}}</ts-tplscript>
<script type="text/javascript">
var app=angular.module('myapp',[]);
app.directive('tsTplscript',function(){
return {
restrict:'EAC',
templateUrl:'tpl',
transclude:true
}
});
</script>
关于transclude更加详细的介绍,参见另外一篇文章
2.2 link
link属性的值是一个函数,在该函数中可以操控DOM元素的对象,包括绑定元素的各类事件,定义事件触发时执行的内容等:
link:function(scope,iEle,iAttrs)
link 函数包括3个主要的参数,其中,scope参数表示指令所在的作用域,它的功能与页面中控制器注入的作用域是相同的,iEle参数表示指令中的元素,该元素可以通过Angular内部封装的jqLite进行调用,jqLite相当于是一个压缩版的jQuery,包含了主要的元素操作API,在语法上与jQuery类似,iAttrs参数表示指令元素的属性集合,通过这个参数可以获取元素中的各类属性。
<script type="text/ng-template" id='tpl'>
<button>单击按钮</button>
</script>
<div>
<ts-tplscript></ts-tplscript>
<div>{{content}}</div>
</div>
<script type="text/javascript">
var app=angular.module('myapp',[]);
app.directive('tsTplscript',function(){
return {
restrict:'EAC',
templateUrl:'tpl',
replace:true,
link:function(scope,iEle,iAttrs){
iEle.bind('click',function(){
scope.$apply(function(){
scope.content='这是点击后的内容';
})
iAttrs.$$element[0].disabled=true;//这里也可以替换为this.disabled=true;
});
}
}
});
</script>
自定义tsTplscript指令时,在指令返回的对象中添加了link属性,用于绑定和执行DOM元素的各类事件,在属性值执行的函数中,添加scope,iEle,iAttrs三个参数,在指令执行的过程中,由于指令中并没有定义scope属性,因此,scope参数默认就是元素外层父级scope属性,即控制器注入的$scope属性。
此外,iEle参数就是被指令模板替换后的<button>元素,由于在Angular中引入了jqLite,因此可以直接调用bind方法绑定元素的各类事件,在执行事件函数的时候,调用了scope属性的$apply方法,它的功能是在执行完方法中的函数之后,重新渲染页面视图。
iAttrs参数是指令元素的属性集合,$$element则表示与属性对应的元素集合,该集合是一个数组。
2.3 compile
<div ng-controller='myController'>
<ts-a>
<ts-b>
{{tip}}
</ts-b>
</ts-a>
</div>
<script type="text/javascript">
var app=angular.module('myapp',[]);
app.controller('myController',function($scope){
$scope.tip='跟踪compile执行过程 ';
});
app.directive('tsA',function(){
return {
restrict:'EAC',
compile:function(tEle,tAttrs,trans){
console.log('正在编译A指令');
//返回一个对象时,对象中包含两个名为`pre`和`post`的方法函数
return {
pre:function(scope,iEle,iAttrs){
console.log('正在执行A中的pre函数');
},
post:function(scope,iEle,iAttrs){
console.log('正在执行A中的post函数');
}
}
}
}
});
app.directive('tsB',function(){
return {
compile:function(tEle,tAttrs,trans){
console.log('正在编译B指令');
return{
pre:function(scope,iEle,iAttrs){
console.log('正在执行B中的pre函数');
},
post:function(scope,iEle,iAttrs){
console.log('正在执行B中的post函数');
}
}
}
}
})
</script>
控制台依次输出:
正在编译A指令 正在编译B指令 正在执行A中的pre函数 正在执行B中的pre函数 正在执行B中的post函数 正在执行A中的post函数
2.4 scope
2.4.1 当scope值是布尔类型
scope属性自定义指令时,默认值就是布尔类型的,初始值为false,在这种情况下,指令中的作用域就是指令元素所在的作用域,如果scope属性值为false,表示不创建新的作用域,直接继承父级作用域,二者数据完全相同,一方有变化,另外一方面将会自动变化。
如果scope属性值为true,表示子作用域是独立创建的,当它的内容发生变化时,并不会修改父作用域中的内容,不仅如此,一旦某个属性被子作用域进行了重置,那么,即使父作用域中的内容变化了,子作用域对应的内容也不会随之变化。
<script type="text/ng-template" id='tpl'>
<div>{{message}}</div>
<button ng-transclude></button>
</script>
<div>
<input type="text" ng-model='message' />
<ts-message>固定</ts-message>
</div>
<script type="text/javascript">
var app=angular.module('myapp',[]);
app.directive('tsMessage',function(){
return {
restrict:'EAC',
templateUrl:'tpl',
transclude:true,
scope:true,
link:function(scope,iEle,iAttrs){
iEle.bind('click',function(){
scope.$apply(function(){
scope.message='这是单击按钮后的值。'
})
})
}
}
});
</script>
在单击按钮之前,子作用域中的值随父作用域改变,当单击按钮之后,手动重置了子作用域中的'message'遍历,但与变量绑定的父作用域的内容并没有变化,并且子作用域也不再随父作用域发生变化。
2.4.2 当scope值是对象
如果将scope属性值设置成一个JSON对象,那么父作用域与子作用域完全独立,不存在任何关联。
当指令中的scope属性值是JSON对象时,如果子作用域需要添加属性,必须先添加指令中的link函数,然后通过函数中的scope对象进行添加,如果在子作用域中,要绑定或调用父父作用域中的属性和方法,则需要在scope属性对应的JSON对象值中添加绑定策略。
严格来说,在JSON对象中添加的有3种绑定策略:@ = &
1、@
@绑定与将scope值设为true,有许多相同的地方,唯一不同之处在于,@绑定在子作用域充值属性之后,再返回修改父作用域对应属性内容时,子作用域对应的属性,同样还是会随之发生变化,而使用scope:true,则不会发生这一步。
2、=
=绑定的功能是创建一个父与子作用域可以同时共享的属性,即当父作用域修改了该属性,子作用域也随之变化,反之亦然,两个作用域间完全共享和同步。
3、&
&绑定的功能是可以在独立的子作用域中直接调用父作用域的方法,在调用时可以向函数传递参数,这种功能的好处在于,避免重复编写功能相同的代码,只需要进行简单的绑定设置,就可以使指令执行后,轻松调用控制器中的方法。
<script type="text/ng-template" id='tpl'>
<div>
<span>姓名:{{textName}}</span>
<span>年龄:{{textAge}}</span>
</div>
<button ng-transclude></button>
</script>
<div ng-controller="myController">
姓名:<input type="text" ng-model='text_name' /><br>
年龄:<input type="text" ng-model='text_age' /><br>
<div>{{tip}}</div>
<ts-json a-attr="{{text_name}}" b-attr="text_age" reset="reSet()">重置</ts-json>
</div>
<script type="text/javascript">
var app=angular.module('myapp',[]);
app.controller('myController',function($scope){
$scope.reSet=function(){
$scope.tip='姓名与年龄重置成功!';
}
});
app.directive('tsJson',function(){
return {
restrict:'EAC',
templateUrl:'tpl',
transclude:true,
scope:{
textName:'@aAttr',
textAge:'=bAttr',
reSet:'&reset'
},
link:function(scope,iEle,iAttrs){
iEle.bind('click',function(){
scope.$apply(function(){
scope.reSet();
scope.textName='张三';
scope.textAge='20';
})
})
}
}
});
</script>
绑定的过程:
先在指令元素中创建a-attr或b-attr属性,由于HTML不区分大小写,因此使用-隔开。
需要注意的是:由于在指令中绑定策略不同,在指令元素中,属性绑定属性值也会有些变化,使用@绑定的属性,绑定属性值的方式为双大括号{{}},而使用=绑定的属性,绑定属性值的方式为等于号=,不需要双大括号.
2.5 require和controller
当一个子元素需要与一个父元素指令通信时,就需要添加并使用这两个属性值。
<div>
<ts-parent>
<div>{{ptip}}</div>
<ts-child>
<div>{{ctip}}</div>
</ts-child>
<button ng-click='click()'>换位</button>
</ts-parent>
</div>
<script type="text/javascript">
var app=angular.module('myapp',[]);
app.directive('tsParent',function(){
return {
restrict:'EAC',
controller:function($scope,$compile,$http){
this.addChild=function(c){
$scope.ptip='今天天气不错!';
$scope.click=function(){
$scope.tmp=$scope.ptip;
$scope.ptip=c.ctip;
c.ctip=$scope.tmp;
}
}
}
}
});
app.directive('tsChild',function(){
return {
restrict:'EAC',
require:'^?tsParent',
link:function(scope,iEle,iAttrs,ctrl){
scope.ctip='气温正好18摄氏度';
ctrl.addChild(scope);
}
}
})
</script>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# angular
# 属性指令
# angularjs
# 指令详解
# angularJs关于指令的一些冷门属性详解
# 绑定
# 是一个
# 单击
# 这是
# 值为
# 象中
# 布尔
# 自定义
# 只需要
# 与子
# 的是
# 直接调用
# 是在
# 也会
# 将会
# 不需要
# 遍历
# 设为
# 要在
# 这两个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何在建站之星绑定自定义域名?
如何快速生成高效建站系统源代码?
如何在宝塔面板中创建新站点?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
如何在云虚拟主机上快速搭建个人网站?
Laravel如何实现API速率限制?(Rate Limiting教程)
如何在香港服务器上快速搭建免备案网站?
C++时间戳转换成日期时间的步骤和示例代码
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel如何实现模型的全局作用域?(Global Scope示例)
如何快速查询域名建站关键信息?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
JavaScript如何操作视频_媒体API怎么控制播放
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Python进程池调度策略_任务分发说明【指导】
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
详解jQuery中基本的动画方法
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
电商网站制作价格怎么算,网上拍卖流程以及规则?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel定时任务怎么设置_Laravel Crontab调度器配置
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
原生JS实现图片轮播切换效果
青岛网站建设如何选择本地服务器?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
教你用AI润色文章,让你的文字表达更专业
用yum安装MySQLdb模块的步骤方法
如何快速搭建安全的FTP站点?
智能起名网站制作软件有哪些,制作logo的软件?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
英语简历制作免费网站推荐,如何将简历翻译成英文?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel如何实现文件上传和存储?(本地与S3配置)
如何快速辨别茅台真假?关键步骤解析
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
中山网站制作网页,中山新生登记系统登记流程?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】

