发表于: 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麻烦多的多了。

明天做啥:开始最难的搜索部分了!!!


返回列表 返回列表
评论

    分享到