发表于: 2017-07-01 23:35:01
0 891
今天做了啥/收获:
自定义指令一直是我很大的短板:
在AngularJS中,除了内置指令如ng-click等,我们还可以自定义指令。自定义指令,是为了扩展DOM元素的功能。代码中,通过指定directive中的restrict属性,来决定这个指令是作为标签(E)、属性(A)、属性值(C)、还是注释(M)。指令的定义过程就不详述了,可以参考其余小课堂。今天主要讲一下自定义指令中scope属性取值的区别。
scope这个属性用来修饰指令的作用域。每次在注册一个指令的时候,这个指令都会考虑一个问题,我们用我自己所在作用域呢,还是创建一个从父作用域继承的子作用域呢,还是创建一个隔离的作用域呢(不依赖外部的作用域)。
scope属性的3种取值:
1、false(默认值):直接使用父scope。
2、true:继承父scope
3、对象{ }:创建一个新的“隔离”scope,但仍可与父scope通信
隔离的scope,通常用于创建可复用的指令,也就是它不用管父scope中的model。然而虽然说是“隔离”,但通常我们还是需要让这个子scope跟父scope中的变量进行绑定。绑定的策略有3种:
@:单向绑定,外部scope能够影响内部scope,但反过来不成立
=:双向绑定,外部scope和内部scope的model能够相互改变
&:把内部scope的函数的返回值和外部scope的任何属性绑定起来
一、scope属性的3种取值的具体影响
1、false(默认值):直接使用父scope。比较“危险”。
可以理解成指令内部并没有一个新的scope,它和指令以外的代码共享同一个scope。我们创建的指令继承了父作用域的一切属性和方法,这也使得在指令的模板中我们可以使用这些属性和方法。
因为我们将scope的属性设置为false所以,我们创建的指令继承了父作用域的一切属性和方法,这也使得在指令的模板中我们可以使用这些属性和方法。注意:此时我们在输入框里改变名字,会发现上面的两个名字都发生了变化,你肯定会说,这肯定是这样啊,数据绑定嘛,好,我们接着往下走。
2、true:继承父scope
当把scope属性设置为true时,这表明我们创建的指令要创建一个新的作用域,这个作用域继承自我们的父作用域。等等,刚才我们不是说了,当把scope属性值设置为false时,不也是继承我们的父作用域吗?不要急,我们先看下demo。
然后我们再试着在我们的input输入框中写一些字符串,会发现,指令中的那个name发生了变化,但是指令外的那个name却没有发生变化,这说明了一个问题。
1、当我们将scope设置为false的时候,我们创建的指令和父作用域(其实是同一个作用域)共享同一个model模型,所以在指令中修改模型数据,它会反映到父作用域的模型中。
2、当我们将scope设置为true的时候,我们就新创建了一个作用域,只不过这个作用域是继承了我们的父作用域;我觉得可以这样理解,我们新创建的作用域是一个新的作用域,只不过在初始化的时候,用了父作用域的属性和方法去填充我们这个新的作用域。它和父作用域不是同一个作用域。
3、{ }:创建一个新的“隔离”scope,当我们将scope的属性设置为{}时,我们可以做更多的事情。
AngularJS最强的大的地方之一就是它可以构建组件,无论放在哪里都是可以使用的;这所以可以做到这些,不得不归功于指令的这个属性;当我们将scope设置为{}时,意味着我们创建的一个新的与父作用域隔离的新的作用域,这使我们在不知道外部环境的情况下,就可以正常工作,不依赖外部环境。
所以隔离的scope,通常用于创建可复用的指令,也就是它不用管父scope中的model。
我们使用了隔离的作用域,不代表我们不可以使用父作用域的属性和方法。我们可以通过向scope的{}中传入特殊的前缀标识符(即prefix),来进行数据的绑定。在创建了隔离的作用域,我们可以通过@,&,=引用应用指令的元素的属性。
绑定的策略有3种:@、=、&
1、@
单项绑定的前缀标识符使用方法:在元素中使用属性,好比这样
my-directive my-name="{{name}}">,注意,属性的名字要用-将两个单词连接,因为是数据的单项绑定所以要通过使用{{}}来绑定数据。
2、=
双向数据绑定前缀标识符使用方法:在元素中使用属性,好比这样
my-directive age="age"> ,注意,数据的双向绑定要通过=前缀标识符实现,所以不可以使用{{}}。
3、&
绑定函数方法的前缀标识符使用方法:在元素中使用属性,好比这样
my-directive change-my-age="changeAge()">,注意,属性的名字要用-将多个个单词连接。
注意:在新创建指令的作用域对象中,使用属性的名字进行绑定时,要使用驼峰命名标准。
问题:马丹 有时候改样式比写JS麻烦多的多了。
明天做啥:开始最难的搜索部分了!!!
评论