博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AngularJS使用directive自定义指令
阅读量:4611 次
发布时间:2019-06-09

本文共 5300 字,大约阅读时间需要 17 分钟。

AngularJS使用directive自定义指令

directive

除了AngularJS的内置指令,我们也可以通过.directive来创建自定义的指令。

app.directive("myDir",function(){      return {          template:"

这是自定义指令

"   }  })

命名

AngularJS要求自定义的Directive命名使用驼峰式语法。也就是从第二个单词开始,每个单词首字母大写,并且不用任何连接符号。

命名 使用
dir dir
myDir my-dir
myDirArray my-dir-array

参数

restrict:String,                priority:Number,terminal:Boolean,template:String or Template Function,templateUrl:String or Template Function,replace:Boolean or String,transclude:Boolean,scope:Boolean or Object,controller:String or function(scope, element, attrs, transclude, otherInjectables) { ... },controllerAs:String,require:String,link: function(scope, iElement, iAttrs) { ... },compile:function(tElement, tAttrs, transclude) {    return {        pre: function(scope, iElement, iAttrs, controller) { ... },        post: function(scope, iElement, iAttrs, controller) { ... }       }    return function postLink(...) { ... }    }

这里是Directive的所有参数,下面我们主要介绍一下常用的参数restrict,template,scope,link,compile

组合使用例子

restrict

restrict描述了我们怎么使用自定义指令,以上面自定义的myDir为例

参数 使用
E(Element) <my-dir></my-dir>
A(attribute) <div my-dir></div>
C(class) <div class="my-dir"></div>
  • EAC可以组合使用
    

1487780-20180925110538194-1419517580.png

scope

scope:为directive指定相关联的作用域

参数 使用
false(默认值) 将使用parentscope;改变scope中的值,directive的值也会发生变化,反之亦如此
true 创建一个继承parent``scope的子scope ;改变parent``scope中的值,子scope会发生变化;改变子scope中的值,parent``scope不会发生变化
{} 创建一个独立的scope,可以使用 @ = &parent``scope进行属性绑定;不继承parent``scope改变任何一方都不影响对方
false和true
  • 我们点击button会发现directive E``directive C的值都会发生变化,

1487780-20181010112110839-1590238546.png

  • 修改age对应的input框只有directive C的age会发生变化

1487780-20181010112123674-30268226.png

@ = &

scope{}时,用三者的主要区别为

type describe
@ (@attr) Text binding / one-way binding
= (=attr) Direct model binding / two-way binding
& Behaviour binding / Method binding
  • @传递的是字符串不是对象
//html       
//directive scope:{ name:"=newName", age:"@nawAge", changeAge:"&" }

两种写法是相同的

1487780-20181010112205829-483734062.png

  • @也可以定义在link
.directive("myDir", function() {    return {       template:"
"+ "
 name:"+ "
 age:"+ "
{
{age}}
"+ "
", restrict:"E", scope:{ name:"=", /*age:"@",*/ changeAge:"&" }, link:function(scope, iElement, iAttrs){ //scope.age = iAttrs.age; 这么写 只有在第一次加载的时候等于`scope age`但是不会随着changeAge事件更新 iAttrs.$observe('age', function(value) { scope.age = value; }) } };});
  • 如果用使用&绑定函数传参数需要json 否则会报错

TypeError: Cannot use 'in' operator to search for 'editWebsite' in 1

template:"
"+ "
 name:"+ "
 age:"+ "
{
{age}}
"+ "
"

在使用前我们先简单了解一下下面两个阶段-编译和链接阶段

第一个阶段是编译阶段,AngularJS会递归的遍历DOM,并从JavaScript中的指令定义知道需要执行的操作。

1487780-20181010111925912-1638982290.png

如图(from stackoverflow)所示原始DOM模板作为函数的参数传给compile编译函数,编译后会返回它的实例。我们有机会在它被返回前对DOM模板进行操作。

1.1 我们以ng-repeat为例,HTML中生成的重复元素就是DOM模板的实例。实例有多个但是模板元素只有一个。

    

1487780-20181010112219007-465610797.png

第二个阶段是链接阶段,链接函数link将模板与作用域链接起来。负责设置事件监听器、监视数据变化和实时的DOM操作。

1487780-20181010112017863-1790283628.png

  • 如果定义了编译函数compile它会返回pre-linkpost-link函数

  • 如果只定义了链接函数link,则会被视为post-link

If you create a directive that only has a link function, AngularJS treats the function as a post-link function. Hence the reason to discuss it here first.

post-link会和前面DOM遍历相反的顺序调用。这个顺序保证所有子元素的post-link在父元素post-link运行时都已经被执行了。

  • pre-link是AngularJS提供了一个额外的钩子。它可以让你在子元素的post-link函数之前运行你的代码。

1487780-20181010112258177-190394902.png

post-link被认为是最安全的,因为此时所有子元素都已经被编译compile并且所有子元素的pre-linkpost-link都已经执行结束。

所以这里是自定义指令最常用的地方,大多数情况下我们只需要编写link函数即可

.directive("myDir", function() {    return {       template:"{
{info.name}}:
"+ "{
{info.age}}
", restrict:"E", compile:function(tELe ,tAttrs,transcludeFn){ return{ // 子元素被链接之前执行 pre:function(scope, iElement, iAttrs, controller){}, // 子元素被链接之后执行 post:function(scope, iElement, iAttrs, controller){ // 绑定DOM事件 iElement.on('click',function(){ scope.$apply(function(){ scope.infoList[0].name += "_"; scope.infoList[0].age ++; }); }); } } } };});

等于下面这种写法

.directive("myDir", function() {                return {                    template: "{
{info.name}}:
" + "{
{info.age}}
", restrict: "E", link: function(scope, iElement, iAttrs) { iElement.on('click', function() { scope.$apply(function() { scope.infoList[0].name += "_"; scope.infoList[0].age++; }); }); } }; });

1487780-20181010112233121-1174526339.png

        

转载于:https://www.cnblogs.com/chenjy1225/p/9679775.html

你可能感兴趣的文章
异常处理
查看>>
/proc/uptime详解
查看>>
如何建立合适的索引?
查看>>
acwing 651. 逛画展
查看>>
(待完成)qbxt2019.05 总结12 - 趣味题目 鹰蛋
查看>>
[2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
查看>>
关于WPF程序只运行一个实例的方法
查看>>
局域网内访问机器时出现“未授予在次计算机上的请求登陆类型”
查看>>
Bogart BogartAutoCode.vb
查看>>
JavaScript面试题
查看>>
[转帖]架构师眼中的高并发架构
查看>>
ios的一些开源资源
查看>>
HTTP 错误 500.21 - Internal Server Error 解决方案
查看>>
Bucks sign Sanders to $44 million extension
查看>>
【PHP】Windows下配置用mail()发送邮件
查看>>
HDU5950【矩阵快速幂】
查看>>
在线C++编译器
查看>>
C#中各种serialization的比较
查看>>
P2617 Dynamic Rankings
查看>>
工作学习常识1
查看>>