From:http://www.linuxidc.com/Linux/2015-05/116924.htm

scope:{}使指令与外界隔离开来,使其模板(template)处于non-inheriting(无继承)的状态,当然除非你在其中使用了transclude嵌入,这点之后的笔记会再详细记录的。但是这显然不符合实际开发中的需求,因为实际上,我们经常想要我们的指令能够在特定的情况下与外界进行数据上的交互,这就需要借助绑定策略之手了。

大家知道,当scope选项写为scope:{}这种形式的时候,就已经为指令生成了隔离作用域,现在,我们来看看绑定策略的三种形式:& 、= 、@。

绑定策略@:针对字符串

首先是@,它将本地作用域和DOM中的属性值绑定起来(且这个属性的值必须是父级作用域中的),什么意思呢?说的简单一点就是假设你在模板中有个双花括号表达式,然后我们把表达式里的内容和html中指令里特定名字的属性绑定起来,还是不懂?看看下面的代码:

JS代码:

directive("direct",function(){return{restrict: 'ECMA',template: '<div>指令中:{{ name }}</div>',scope:{name:'@forName'}}})
.controller("nameController",function($scope){$scope.Name="张三";
});

HTML代码:

<div ng-controller="nameController"><direct for-name="{{ Name }}"></direct>
<div>

运行结果可想而知,{{ name }}成功地与父控制器中的Name绑定起来了。当然这里也可以这样写 name:'@' 这样写的话,就默认DOM中的属性名为name了意即 for-name="{{ Name }}"可简写为name="{{ Name }}";其实,另外两个符号=和&也有这样的简写规则,方便起见接下来都使用这种写法。

绑定策略=:针对对象的引用

@到此为止,接下来就是'='了。=与@的不同点在于,@是针对字符串而用,但=是针对某个对象的引用,这么说可能不太专业,但就拿上边的例子而言,我们在html中,把Name这个字符串通过一对双花括号传递给for-name属性,但如果我们用了=,这里传入的Name就不应该是一个字符串,而是一个对象的引用。这不是一个很一目了然的概念,所以我用接下来的两个例子诠释它的含义。

第一个例子:数组中的对象的引用

JS代码:

directive("direct",function(){return{restrict: 'ECMA',template: '<div>指令中:{{ case.name }}</div>',scope:{case:'='}}})
.controller("nameController",function($scope){$scope.data=[{name:"张三"},{name:"李四"}];
});

HTML代码:

<div ng-controller="nameController"><direct case="data[0]"></direct><direct case="data[1]"></direct>
<div>

结果就是,一个张三,一个李四。这个例子中,data是一个对象数组,里面包含了两个对象,所以,我们分别把两个对象传递给了case这个属性,case属性就把这个对象的引用传递给了模板中我们写的{{ case.name }}中的case;而如果你在=后边加上了自己定义的名字,那只要把html里case属性换成那个名字就可以了。

第二个例子:经典的双向输入框

按照Angular的入门案例,创建两个双向绑定的输入框,最简单的实现方式就是:

<input ng-model="test"/>
<input ng-model="test"/>

使用ng-model指令就可以做到了。接着,我们在自己的指令中实现这个效果。

JS代码:

directive("direct",function(){return{restrict: 'ECMA',template: '<div>指令中:<input ng-model="model"/></div>',scope:{model:'='}}})
.controller("nameController",function($scope){$scope.data=[{name:"张三"},{name:"李四"}];
});

HTML代码:

<div ng-controller="nameController">父级scope中:<input ng-model="mark"/><direct model="mark"/></direct></div>

这就完成了,其实只不过是加了一点小把戏,把ng-model换成了model而已。

注意到,这两个例子中,都是使用对象的引用,而不是单纯的字符串,这也是=可以进行双向绑定的关键。

绑定策略&:针对属性的引用

最后是&符号。它的含义是:对父级作用域进行绑定,并将其中的属性包装成一个函数,注意,是属性,意即,任何类型的属性都会被包装成一个函数,比如一个单纯的字符串,或是一个对象数组,或是一个函数方法,如果是字符串、对象数组和无参的函数,那么可想而知,它们都会被包装成一个无参的函数,若是有参的函数方法则反之,并且我们需要为其传入一个对象。现在,分别针对有参和无参两种情况举例。

无参情况

JS代码:

.directive("direct",function(){return{restrict: 'ECMA',template: '<div>{{ title }}</div>'+'<div><ul><li ng-repeat="x in contents">{{ x.text }}<li></ul></div>',scope:{getTitle:'&',getContent:'&'           },controller:function($scope){$scope.title=$scope.getTitle();    //调用无参函数 $scope.contents=$scope.getContent();    //调用无参函数
          }}})
.controller("nameController",function($scope){$scope.title="标题";$scope.contents =[{text:1234},{text:5678}];
});

HTML代码:

<div ng-controller="nameController"><direct get-title="title" get-content="contents"></direct></div>

这个例子有几个注意点:

1.指令的本地属性(即模板里花括号中的属性)需要从本地取值,所以使用了controller选项,而在controller选项中,两个无参方法分别返回了父级scope中的title字符串和contents对象数组。

2.在HTML中,我们把设置了get-title和get-content的属性值为title和contents,这实际上就完成了与父级scope的绑定,因为我们才可以从那儿取得实质的内容。

有参情况

JS代码:

.directive("direct",function(){
return{restrict: 'ECMA',template: '<div><input ng-model="model"/></div>'+'<div><button ng-click="show({name:model})">show</button>',scope:{show:'&'             }                     }}).controller("nameController",function($scope){$scope.showName=function(name){alert(name);}});

HTML代码:

<div ng-controller="nameController"><direct show="showName(name)"></direct>
</div>

这个例子中,通过模板中的ng-click触发了show函数并将一个叫做model的对象作为name参数传递了进去,而在html中,我们把show的属性值设为showName(name)。这其中的道理跟无参的例子是大同小异的。

转载于:https://www.cnblogs.com/dorothychai/p/4743273.html

AngularJS学习笔记之directive—scope选项与绑定策略相关推荐

  1. 【AngularJs学习笔记三】Grunt任务管理器

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  2. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  3. jQuery学习笔记之DOM操作、事件绑定(2)

    jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...

  4. nrf52832 学习笔记(六)配对和绑定

    nrf52832 学习笔记(六)配对和绑定 配对绑定推荐博客低功耗蓝牙配对绑定解读和实践 蓝牙在配对之前都是明文通信的,也就是说主从机之间传输的数据包可以被第三方抓取分析逆向,而且如果没有配对,谁都可 ...

  5. AngularJs学习笔记--directive

    2019独角兽企业重金招聘Python工程师标准>>> 一.在HTML中引用directives Directive有驼峰式(camel cased)的风格的命名,如ngBind(放 ...

  6. AngularJs学习笔记--unit-testing

    原版地址:http://docs.angularjs.org/guide/dev_guide.unit-testing javascript是一门动态类型语言,这给她带来了很强的表现能力,但同时也使编 ...

  7. AngularJS学习笔记(3)——通过Ajax获取JSON数据

    通过Ajax获取JSON数据 以我之前写的与用户交互的动态清单列表为例,使用JSON前todo.html代码如下: <!DOCTYPE html> <html ng-app=&quo ...

  8. AngularJS学习笔记(1)——MVC模式的清单列表效果

    MVC模式的清单列表效果 使用WebStorm新建todo.html并链入bootstrap.css.bootstrap-theme.css.angular.js.要链入的相关css和js文件预先准备 ...

  9. AngularJs学习笔记--html compiler

    2019独角兽企业重金招聘Python工程师标准>>> 一.总括 Angular的HTML compiler允许开发者自定义新的HTML语法.compiler允许我们对任意HTML元 ...

最新文章

  1. 美加州希望立法叫停加密手机
  2. python绘制直方图显示数字_python plotly绘制直方图实例详解
  3. 两台计算机怎样共享一台打印机共享文件夹,两台电脑怎么共享文件和打印机
  4. notepad++正则表达式使用
  5. PS动感映像插件ImageMotion 1.3中文汉化版
  6. matlab 简单函数拟合(全)
  7. 5s管理常用工具汇总
  8. MacOS获取辅助功能权限控制鼠标点击事件
  9. java一个球左右躲避障碍_java 飞机躲避小游戏分析及实现[源码][附图]
  10. JAVA+MySQL 图书馆借阅信息管理系统
  11. coldfusion_ColdFusion中的一周:1月30日至2月5日:一切
  12. 如何在Kubernetes中部署nginx
  13. 服务器IIS架设网站无法增加log文件
  14. 才智杂志才智杂志社才智编辑部2022年第35期目录
  15. 电子商务编程C语言考试,计算机络级计算机的络与电子商务专业《c语言程序设计》试卷.doc...
  16. 千锋python培训费用具体是多少?
  17. 小六六读Effective记录
  18. 计算机一级培训 ppt,计算机基础培训ppt
  19. 比锐速还强的 TCP拥塞控制技术 —— TCP-BBR 测试及开启教程
  20. 高校房产管理的现状及发展的必要性探讨数图互通

热门文章

  1. 20个很有帮助的 Web 前端开发教程
  2. web前端开发规范总结
  3. 20道有代表性的HTML基础题,测测你能入前端的门吗
  4. python读写excel的图片_python解析excel中图片+提取图片
  5. TCP通信之获取本机IPV4地址
  6. jsonhelper java_JSON和JAVA的POJO的相互转换
  7. 我php第一个页面,您的第一个 PHP 页面
  8. mapbox 导航_寻宝风格导航地图 Treasure 诞生记 | Mapbox 地图设计思路
  9. 以下构成python循环结构的方法中正确的是_python教程:python循环结构
  10. C语言排序方法-----希尔排序