在angularjs中,一个directive返回一个对象,对象存在很多属性,并且可以在directive中自定义自己的scope,而使用自己的scope是为了防止一个directive被使用在多个地方之间发生相互影响,通常这个scope可以被定义为true或者对象,当这个scope被定义为true时,代表这个指令拥有独立的scope,它被多次使用在多个地方之间不会相互影响,例如:

HTML代码

  1. <!doctype html>
  2. <html ng-app="MyModule">
  3. <head>
  4. <meta charset="utf-8">
  5. <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
  6. </head>
  7. <body>
  8. <hello></hello>
  9. <hello></hello>
  10.  
  11. </body>
  12. <script src="framework/angular-1.3.0.14/angular.js"></script>
  13. <script src="IsolateScope.js"></script>
  14. </html>

js代码

  1. var myModule = angular.module("MyModule", []);
  2. myModule.directive("hello", function() {
  3. return {
  4. restrict: 'AE',
  5. //这里是创建了一个独立的scope,以防止各个指令之间相互影响
  6. scope:true,
  7. template: '<div><input type="text" ng-model="userName"/>{{userName}}</div>',
  8. replace: true
  9. }
  10. });

演示效果:

你会发现这两个指令之间输入没有互相影响。当你不指定这个directive中的scope属性的时候,例如这样

  1. var myModule = angular.module("MyModule", []);
  2. myModule.directive("hello", function() {
  3. return {
  4. restrict: 'AE',
  5. //这里是创建了一个独立的scope,以防止各个指令之间相互影响
  6. // scope:true,
  7. template: '<div><input type="text" ng-model="userName"/>{{userName}}</div>',
  8. replace: true
  9. }
  10. });

那么显示效果如下:

操作其中一个input,那么任何使用这个指令的地方都会被修改。即这个指令的多个实例之间是共享一个 scope的

scope也可以被设定为一个对象,即{},当设定为空对象{}的时候,效果和设置为true一样,这里可以通过将其设定为不为空的对象以达到复用其对应controller中的属性及方法。

要复用其对应controller(即其父scope)中的方法和对象,angular提供了三种修饰符:

第一种为:@,这表示绑定的是一个字符串,而且是单向绑定

  1. <!doctype html>
  2. <html ng-app="MyModule">
  3. <head>
  4. <meta charset="utf-8">
  5. <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
  6. </head>
  7. <body>
  8. <div ng-controller="MyCtrl">
  9. <drink flavor="{{ctrlFlavor}}"></drink>
  10. </div>
  11. </body>
  12. <script src="framework/angular-1.3.0.14/angular.js"></script>
  13. <script src="ScopeAt.js"></script>
  14. </html>

js 代码

  1. var myModule = angular.module("MyModule", []);
  2. myModule.controller('MyCtrl', ['$scope', function($scope){
  3. $scope.ctrlFlavor="111";
  4. }])
  5. myModule.directive("drink", function() {
  6. return {
  7. restrict:'AE',
  8. //这里的
  9. scope:{
  10. //@表示把当前属性作为字符串进行绑定
  11.  
  12. flavor:'@'
  13.  
  14. },
  15. template:"<div>{{flavor}}</div>"
  16.  
  17. }
  18. });

首先这个指令会将HTML中的drink标签替换为"<div>{{flavor}}</div>",而原HTML的<drink flavor="{{ctrlFlavor}}"></drink>存在一个flavor的属性,指定其绑定了一个表达式,而directive中又指定了这个表达式是个字符串 scope:{flavor:'@'},这就将drink标签的flavor属性指向了其对应的controller即MyCtrl中的scope中的ctrlFlavor上,这样directive就复用了其controller中的一个属性,但是这种复用或者叫绑定是单向的,只有controller发生改变directive内容才会改变,显示效果如下:

这是第一种修饰符@的作用,简单来就是让directive可以单向绑定其父scope中的属性;

第二种修饰符是=,表示绑定的是其父scope中的属性,但是是双向绑定,代码如下:

  1. <!doctype html>
  2. <html ng-app="MyModule">
  3. <head>
  4. <meta charset="utf-8">
  5. <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
  6. </head>
  7. <body>
  8. <div ng-controller="MyCtrl">
  9. Ctrl:
  10. <br>
  11. <input type="text" ng-model="ctrlFlavor">
  12. <br>
  13. Directive:
  14. <br>
  15. <drink flavor="ctrlFlavor"></drink>
  16. </div>
  17. </body>
  18. <script src="framework/angular-1.3.0.14/angular.js"></script>
  19. <script src="ScopeEqual.js"></script>
  20. </html>

js代码:

  1. var myModule = angular.module("MyModule", []);
  2. myModule.controller('MyCtrl', ['$scope', function($scope){
  3. $scope.ctrlFlavor="111";
  4. }])
  5. myModule.directive("drink", function() {
  6. return {
  7. restrict:'AE',
  8. scope:{
  9. flavor:'='
  10. },
  11. template:'<input type="text" ng-model="flavor"/>'
  12. }
  13. });

这里将flavor依然指向的是其controller的scope中的ctrFlavor属性,但是进行模板替换的时候使用的是ng-model 用来进行双向数据操作,注意到 scope:{flavor:'='},这说明这个directive的flavor属性进行了一个双向绑定,而对应的html中不再是使用{{}}这种单向绑定了,而是直接将这个<drink flavor="ctrlFlavor"></drink>属性指向了controller中的scope中的ctrlFlavor属性,简单来讲,就是利用=修饰符,你可以让你的directive与其父作用域中的某个属性进行双向绑定;

第三种修饰符是&,它的含义是用来绑定directive父作用域中的某个函数,代码如下:

  1. <!doctype html>
  2. <html ng-app="MyModule">
  3. <head>
  4. <meta charset="utf-8">
  5. <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css">
  6. </head>
  7. <body>
  8. <div ng-controller="MyCtrl">
  9. <greeting greet="sayHello(name)"></greeting>
  10. <greeting greet="sayHello(name)"></greeting>
  11. <greeting greet="sayHello(name)"></greeting>
  12. </div>
  13. </body>
  14. <script src="framework/angular-1.3.0.14/angular.js"></script>
  15. <script src="ScopeAnd.js"></script>
  16. </html>

js代码

  1. var myModule = angular.module("MyModule", []);
  2. myModule.controller('MyCtrl', ['$scope', function($scope){
  3. $scope.sayHello=function(name){
  4. alert("Hello "+name);
  5. }
  6. }])
  7. myModule.directive("greeting", function() {
  8. return {
  9. restrict:'AE',
  10. scope:{
  11. greet:'&'
  12. },
  13. template:'<input type="text" ng-model="userName" /><br/>'+
  14. '<button class="btn btn-default" ng-click="greet({name:userName})">Greeting</button><br/>'
  15. }
  16. });

在这里,directive中的scope中设定一个属性为 scope:{ greet:'&'},&代表这个指令的greet属性绑定了其父scope中的一个函数,而在HTML中<greeting greet="sayHello(name)"></greeting>greet指向的是其父scope(即controller)的sayHello方法,并传递一个参数name,同时在模板替换中,将ng-click设定为greet属性对应的值,这里传递的参数是一个对象ng-click="greet({name:userName})",这种写法是用来收集input中输入的值。

angularjs学习笔记3-directive中scope的绑定修饰符的更多相关文章

  1. AngularJS学习笔记之directive—scope选项与绑定策略

    From:http://www.linuxidc.com/Linux/2015-05/116924.htm scope:{}使指令与外界隔离开来,使其模板(template)处于non-inherit ...

  2. AngularJS学习笔记之directive——scope选项与绑定策略

    开门见山地说,scope:{}使指令与外界隔离开来,使其模板(template)处于non-inheriting(无继承)的状态,当然除非你在其中使用了transclude嵌入,这点之后的笔记会再详细 ...

  3. AngularJs学习笔记(3)——scope

    AngularJS启动并生成视图时,会将根ng-app元素同$rootScope进行绑定. $rootScope是所有$scope对象的最上层,是AngularJS中最接近全局作用域的对象 . 一个n ...

  4. Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类

    一.final关键字 为什么要使用 final 关键字? 通过继承我们知道,子类可以重写父类的成员变量和方法.final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改. 1.被修饰 ...

  5. Java学习笔记(4)--- 变量类型,修饰符

    1.变量类型: a.定义: 和C++差不多,就是: type identifier [ = value][, identifier [= value] ...]: type为Java数据类型.iden ...

  6. angularjs学习笔记三——directive

    AngularJS 通过被称为 指令 的新属性来扩展 HTML. 正如你所看到的,AngularJS 指令是以 ng 作为前缀的 HTML 属性. HTML5 允许扩展的(自制的)属性,以 data- ...

  7. AngularJS学习笔记(一) 关于MVVM和双向绑定

    写在前面: 因为需要开始学习ng,之前在知乎上听大神们介绍ng的时候说这个坑如何的大,学了一阵(其实也就三天),感觉ng做的很大很全,在合适的情境你可以完全使用ng搞定一切.这一点从诸如jqLite之 ...

  8. AngularJS学习笔记(三)数据双向绑定

    双向绑定 双向绑定是AngularJS最实用的功能,它节省了大量的代码,使我们专注于数据和视图,不用浪费大量的代码在Dom监听.数据同步上,关于双向更新,可看下图: 下面,我们通过代码来实现.先不要纠 ...

  9. AngularJs学习笔记--directive

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/directive Directive是教HTML玩一些新把戏的途径.在DOM编译期间,directiv ...

随机推荐

  1. 【Codeforces711E】ZS and The Birthday Paradox [数论]

    ZS and The Birthday Paradox Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample ...

  2. bzoj3172 Ac自动机

    根据fail树的性质 我们在建树的时候每建一个串就将他路径上的点全部加1表示这个串的后缀又出现了一次 然后从下到上把sum加起来就可以得到答案了 #include<cstdio> #inc ...

  3. 取石子游戏 HDU2516(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 题目: Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任 ...

  4. Java中class的初始化顺序

     由于Java 中的一切东西都是对象,所以许多活动 变得更加简单,这个问题便是其中的一例. 除非真的需要代码,否则那个文件是不会载入的.通常,我们可认为除非那个类的一个对象构造完毕,  否则代码不会真 ...

  5. Android使用TextView实现跑马灯效果(自定义控件)

    对于一个长的TetxView 折行显示是一个很好的办法,另一种方法就是跑马灯显示(单行滚动) 1.折行显示的长TextView <LinearLayout xmlns:android=" ...

  6. IT界天才少年:比肩雷军、叫板任正非,自己作死了

    两点之间,走弯路和走直路到达的终点是一样的,而他只是走了弯路,他曾在华为身居高位.后又创业.做投资,完全是不差钱的主. 他跌宕起伏的人生中充满传奇,成功.失败.遗憾.矛盾,每个词都不足以形容他,只有这 ...

  7. mac系统中实现vitualBox中访问内网端口

    第一步,增加外网网段 打开vitualbox后,按管理菜单,点击->主机网络管理器,如图1所示.点击创建,创建下个网络主机. 图1 然后,关掉虚拟机,虚拟机的设置中,找到网络选项卡,然后点击网络 ...

  8. 【SCOI2010】维护序列

    NOI2017的简化版…… 就是维护的时候要想清楚怎么讨论. #include<bits/stdc++.h> #define lson (o<<1) #define rson ...

  9. C后端设计开发 - 第5章-内功-数据结构下卷

    正文 第5章-内功-数据结构下卷 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了.

  10. Xcode7 iOS9.0 的真机调试

    Xcode7的真机调试: 1.Xcode偏好 -> 账号 -> 增加 Apple ID ->显示 free 2.Target 运行 iOS 版本号 3.修正 Team 项   选择 ...