现在发现,当初的自己真的是太菜了,为什么你在指令中更改数据,没有作用呢?这其实是原型链的问题。

  详细的我就不在这里说了,有位大神早已发布了这个内容,在这里复制个地址给大家,有兴趣的可以看看

  http://www.angularjs.cn/A09C

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  忙活了一天终于写出了一个完整的angular指令,在后面的文章再来讲我制作的排序指令,由于还是菜鸟此文章仅仅用来借鉴,希望各位看到有不对的地方,希望能够指点一下。

  这里首先要讲的是angular在创建指令是经常会遇到的几个问题。

  1.作用域绑定策略

    这个其实不知道被讲了多少篇了,但是只有自己开始动手写才发现是很挺复杂的。这里只讲绑定策略,另外的scope:true和scope:false就跳过了

    第一个方法是“@”,这个的意思其实是绑定字符串,实际上是拿到该对象的值,并且是单向的 外部作用域可以影响内部作用域,但指令内部作用域却无法影响外部的作用域,在绑定的时候需要加上{{}} 代表引用scope作用域的值,没加上{{}}代表引用的是一个普通的字符串

    第二个方法是“=”,这个的意思是绑定对象,是双向的外部作用域可以影响内部作用域,但指令内部作用域也可以影响外部的作用域

     第三个方法是“&”,这个是用与controller和指令之间的交互的,控制器的方法可以绑定在这上面使用

    另外在html上如果出现用”-“的命名方法 则在js文件中需要”-“后面的第一个字母要大写,例如<hello-world></hello world> 则在js文件中需要用helloWorld命名

  2.在指令中使用ng内置指令

    这是非常常见的操作,但是类似ng-repeat,ng-switch等等指令是会创建自己的作用域的,这个时候你就需要注意作用域的问题了,这个作用域问题是挺致命的。

    下面写个例子给大家看看关于ng-repeat的问题

这个是一个手风琴效果,内容是来自于《用angularJS开发下一代Web应用的》,没读过的朋友建议买来看一下,还是有很大帮助的,效果就像bootstrap的手风琴,但是我要讲一些书上没有说的东西,大家可以将代码复制下来执行看看。

var myApp = angular.module('MyApp', []);
myApp.controller('myCtrl', ['$scope', function($scope){$scope.isReverse = false;$scope.menuItems = [{title : "This first",content : "This first content"      },{title : "This second",content : "This second content"      },{title : "This third",content : "This third content"      }];
}]);
myApp.directive('accroding',function(){return {controller: function($scope, $element, $attrs, $transclude) {var tabItems = [];this.getOpen = function(selectedItem){angular.forEach(tabItems, function(value, key){if(value != selectedItem){value.isOpen = false;}});}this.addItem = function(tabItem){tabItems.push(tabItem);}},restrict: 'EA', template: '<div ng-transclude></div>',replace: true,transclude: true,        link: function($scope, iElm, iAttrs, controller) {}};
});
myApp.directive('expender', [function(){return {scope: {title : '=expenderTitle',isReverse : '=expenderIsreverse',}, require: '^accroding', restrict: 'EA', template: '<div>'+'<div ng-click="toggle()">{{title}} || isReverse:{{isReverse}}</div>'+'<div ng-show="isOpen" ng-transclude></div>'+'</div>',replace: true,transclude: true,link: function($scope, iElm, iAttrs, controller) {$scope.isOpen = false;controller.addItem($scope);$scope.toggle = function(){$scope.isOpen = !$scope.isOpen;controller.getOpen($scope);$scope.isReverse = !$scope.isReverse;                }}};
}]);

<accroding><expender ng-repeat="item in menuItems" expender-title="item.title" expender-isreverse="order.isReverse">{{item.content}}</expender></accroding><br><div ng-repeat="item in menuItems">{{item.content}} | {{item.title}} || {{isReverse}} </div>

  没错,你发现了什么,你明明有绑定策略‘=’去绑定,但是你点击div触发toogle()的时候,却发现外部的isReverse没有发生改变,指令内部的isReverse却发生改变了。也就是说你并没有双向绑定,这是什么问题呢?让我们看看修改之后的例子

var myApp = angular.module('MyApp', []);
myApp.controller('myCtrl', ['$scope', function($scope){$scope.order = {isReverse : "false",predicate : "2"};$scope.menuItems = [{title : "This first",content : "This first content"      },{title : "This second",content : "This second content"      },{title : "This third",content : "This third content"      }];
}]);
myApp.directive('accroding',function(){return {controller: function($scope, $element, $attrs, $transclude) {var tabItems = [];this.getOpen = function(selectedItem){angular.forEach(tabItems, function(value, key){if(value != selectedItem){value.isOpen = false;}});}this.addItem = function(tabItem){tabItems.push(tabItem);}},restrict: 'EA',template: '<div ng-transclude></div>',replace: true,transclude: true,link: function($scope, iElm, iAttrs, controller) {}};
});
myApp.directive('expender', [function(){// Runs during compilereturn {scope: {title : '=expenderTitle',isReverse : '=expenderIsreverse',predicate : '=expenderPredicate',}, require: '^accroding',restrict: 'EA', template: '<div>'+'<div ng-click="toggle()">{{title}} {{isReverse}} {{predicate}}</div>'+'<div ng-show="isOpen" ng-transclude></div>'+'</div>',replace: true,transclude: true,link: function($scope, iElm, iAttrs, controller) {$scope.isOpen = false;controller.addItem($scope);$scope.toggle = function(){$scope.isOpen = !$scope.isOpen;controller.getOpen($scope);$scope.isReverse = !$scope.isReverse;$scope.predicate = "22";}}};
}]);

<accroding><expender ng-repeat="item in menuItems" expender-title="item.title" expender-isreverse="order.isReverse" expender-predicate="order.predicate">{{item.content}}</expender></accroding><div ng-repeat="item in menuItems">{{item.content}} | {{item.title}} || {{order.isReverse}} || {{order.predicate}}</div>

  把isReverse写成了对象的形式发现可以相互作用了,这就是ngRepeat的问题,ngRepeat创建了一个新的作用域,如果我们用基本数据类型去绑定的话,是无法成功的,需要将数据编程对象的形式去绑定,这样在指令内部改变值之后才可以与外部的作用域绑定,另外尽量在指令中不去使用ng-if,因为ng-if是根据节点决定添加和删除的节点的,当一个元素被ng-if从DOM中删除时,与其关联的作用域也会被销毁。而且当它重新加入DOM中时,则会生成一个新的作用域,而ng-show和ng-hide则不会。

转载于:https://www.cnblogs.com/HeJason/p/5258303.html

angularJS在创建指令需要注意的问题(指令中使用ngRepeat)相关推荐

  1. linux中用命令创建物理卷,11.17 pvcreate指令:创建物理卷

    11.17  pvcreate指令:创建物理卷 [语    法]pvcreate [选项] [参数] [功能介绍]pvcreate指令用于将物理硬盘分区初始化为物理卷,以便被LVM使用. [选项说明] ...

  2. cmd指令大全指令_Linux 超全实用指令大全 | CSDN 博文精选

    作者 | 沉晓 责编 | 屠敏 出品 | CSDN 博客 运行级别和找回root密码指定运行级别运行级别说明:0:关机1:单用户[找回丢失密码]2:多用户状态没有网络服务3:多用户状态有网络服务4:系 ...

  3. 如何在AngularJS中使用ng-repeat迭代键和值?

    本文翻译自:How to iterate over the keys and values with ng-repeat in AngularJS? In my controller, I have ...

  4. 计算机程序的建立命令,数控车床编程指令 编程由一系列的指令组成

    原标题:数控车床编程指令 编程由一系列的指令组成 引言:数控程序员为数控机器编写指令,其中计算机连接到加工设备,以及完整系统的电气驱动器和传感器.这台计算机控制加工设备轴的运动.文章将以数控车床为例, ...

  5. JSP基本语法、3个编译指令、7个动作指令、9个内置对象

    一.jsp概述 JSP是java server page的缩写,其本质是一个简化的servlet,是一种动态网页技术标准.jsp页面是在HTML页面中嵌入java程序段,使用jsp开发的应用程序可以跨 ...

  6. 解决在vscode使用webpack指令显示“因为在此系统中禁止运行脚本“问题

    解决在vscode使用webpack指令显示"因为在此系统中禁止运行脚本"问题 参考文章: (1)解决在vscode使用webpack指令显示"因为在此系统中禁止运行脚本 ...

  7. android 如何实现无限列表,在Android中解析和创建无限/无限级别的List /子列表中的XML...

    在我的Android Application的服务器端应用程序也由我开发.在这个应用程序Android应用程序从服务器请求一些XML并解析它. XML包含描述应用程序中应该有多少标签的信息,并且每个标 ...

  8. arm clz指令c语言,协处理器及其他指令之:零计数指令CLZ-嵌入式系统-与非网

    9.3  零计数指令CLZ ARMv5及其以上版本提供了一条新的指令--零计数指令CLZ(Count Leading Zeros).该指令用于计算最高符号位与第一个1之间的0的个数.当一些操作数需要规 ...

  9. 使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量、单位和绝对类型

    使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量.单位和绝对类型 实现功能 C++实现代码 实现功能 使用 Boost. ...

  10. ARM指令寻址方式之: 数据处理指令的寻址方式

    4.1  数据处理指令的寻址方式 4.1.1  数据处理指令的寻址方式概要 数据处理指令的基本语法格式如下. <opcode> {<cond>} {S} <Rd>, ...

最新文章

  1. 数字化时代,如何解决企业协同办公的问题?
  2. 虽然得了第三名,但依然很快乐...
  3. My Linux 让人高兴的新进展(博客搬家 2007-07-14 13:05)
  4. 【转】Snackbar和Toast的花式使用,这一篇就够了
  5. poj2456 二分搜索 挑战程序设计竞赛
  6. 网站扛住 100 亿次请求?我们来压测试一试
  7. axios传递数据到java_axios 传输与springboot后台接收数据
  8. BZOJ1604 洛谷2906:[USACO2008 OPEN]Cow Neighborhoods 奶牛的邻居——题解
  9. 【路径大全】iphone所有文件路径。CYDIA
  10. Excel表格转JPG等多种图片格式(简单粗暴)
  11. 大麦无线虚拟服务器,大麦路由器192.168.10.1设置教程
  12. 银行账户管理系统GUI
  13. 交换机和集线器的区别
  14. bugku(Crypto)---ook
  15. consul - Go服务发现、配置管理中心服务
  16. win10配置系统默认utf-8编码
  17. 办公室远程 办公室远程,我看这四款行
  18. 机器学习 卷积神经网络 Convolutional Neural Network(CNN)
  19. 自动回复的三种形式?
  20. linux pppd ip up 脚本,pppd拨号脚本配置

热门文章

  1. mysql出现多线程操作同一个表的情况,应该怎么办?
  2. 慎用uniapp开发商业级应用
  3. [2015-11-10]iis远程发布配置
  4. HTC VIVE 虚拟现实眼镜VR游戏体验
  5. Vware Workstation pro 12|虚拟机
  6. bzoj 1037: [ZJOI2008]生日聚会Party
  7. 今天已经算一下过来有一个礼拜了,还是感觉是在熬日子似的
  8. android xml 文件里面的宽度Match_Parent 被 替换成了wrap_content
  9. android onLayout死循环
  10. Android 停止调试程序