zoukankan      html  css  js  c++  java
  • AngularJS 指令的 Scope (作用域)

    参考:https://segmentfault.com/a/1190000002773689

    每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的作用域或者根作用域($rootScope)),还是创建一个新的自己的作用域,当然AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{};默认情况下是false

    scope = false

    在这种情况下,在指令模板中可以直接使用父作用域中的变量,函数

    scope = true

    当把scope属性设置为true时,这表明我们创建的指令要创建一个新的作用域,这个作用域继承自我们的父作用域。

    1. 当我们将scope设置为true的时候,我们就新创建了一个作用域,只不过这个作用域是继承了我们的父作用域;我觉得可以这样理解,我们新创建的作用域是一个新的作用域,只不过在初始化的时候,用了父作用域的属性和方法去填充我们这个新的作用域。它和父作用域不是同一个作用域。
    2. 当我们将scope设置为false的时候,我们创建的指令和父作用域(其实是同一个作用域)共享同一个model模型,所以在指令中修改模型数据,它会反映到父作用域的模型中。

    scope = {}

    当我们将scope的属性设置为{}时,我们可以做更多的事情。

    AngularJS最强的大的地方之一就是它可以构建组建,无论放在哪里都是可以使用的;
    这所以可以做到这些,不得不归功于指令的这个属性;当我们将scope设置为{}时,意味着我们创建的一个新的与父作用域隔离的新的作用域,这使我们在不知道外部环境的情况下,就可以正常工作,不依赖外部环境。

    我们使用了隔离的作用域,不代表我们不可以使用父作用域的属性和方法。

    1. 我们可以通过向scope{}中传入特殊的前缀标识符(即prefix),来进行数据的绑定。
    2. 在创建了隔离的作用域,我们可以通过@,&,=引用应用指令的元素的属性,如上面的代码那样,我们可以在<div class="my-directive" my-directive my-name="{{name}}" age="age" change-my-age="changeAge()"></div>这个元素中,利用前缀标识符通过使用属性my-name,age,change-my-age来引用这些属性的值。

    下面我们来看看如何使用这些前缀标识符:

    @

    这是一个单项绑定的前缀标识符
    使用方法:在元素中使用属性,好比这样<div my-directive my-name="{{name}}"></div>,注意,属性的名字要用-将两个单词连接,因为是数据的单项绑定所以要通过使用{{}}来绑定数据。

    =

    这是一个双向数据绑定前缀标识符
    使用方法:在元素中使用属性,好比这样<div my-directive age="age"></div>,注意,数据的双向绑定要通过=前缀标识符实现,所以不可以使用{{}}

    &

    这是一个绑定函数方法的前缀标识符
    使用方法:在元素中使用属性,好比这样<div my-directive change-my-age="changeAge()"></div>,注意,属性的名字要用-将多个个单词连接。

    注意:在新创建指令的作用域对象中,使用属性的名字进行绑定时,要使用驼峰命名标准,比如下面的代码:

    scope: {
                // `myName` 就是原来元素中的`my-name`属性
                name: '@myName', 
                age: '=',
                // `changeMyAge`就是原来元素中的`change-my-age`属性
                changeAge: '&changeMyAge' 
            }

    进一步说明,我们的指令是如何利用这些前缀标识符来寻找我们想要的属性或者函数的?

    • @ 当指令编译到模板的name时,就会到scope中寻找是否含有name的键值对,如果存在,就像上面那样,看到@就知道这是一个单向的数据绑定,然后寻找原来的那个使用指令的元素上(或者是指令元素本身)含有这个值的属性即my-name={{name}},然后在父作用域查找{{name}}的值,得到之后传递给模板中的name
    • =&@差不多,只不过=进行的是双向的数据绑定,不论模板还是父作用域上的属性的值发生改变都会使另一个值发生改变,而&是绑定函数而已。
  • 相关阅读:
    Vue2.0组件实现动态搜索引擎(一)
    6款 jQuery Lightbox图片查看触控插件
    js学习总结----移动端概述和hybird模式
    js学习总结----less常用的方法
    js学习总结----less的基础语法和使用
    js学习总结----less基础和编译
    js学习总结----柯里化函数
    js学习总结----案例分页之前端代码实现和请求处理
    js学习总结----案例分页之服务器内容和数据的处理
    js学习总结----案例分页之需求分析和制定api文档及测试数据
  • 原文地址:https://www.cnblogs.com/anyun/p/8483783.html
Copyright © 2011-2022 走看看