angularJS中directive与controller之间的通信
当我们在angularJS中自定义了directive之后需要和controller进行通讯的时候,是怎么样进行通讯呢?
这里介绍3种angular自定义directive与controller通信的指令。
1.指令作用域中的"@"
作用:把当前属性作为字符串传递实现指令与html页面元素关联。
<!DOCTYPE html>
<html ng-app="demoapp">
<head lang="en">
<meta charset="UTF-8">
<title>angular-directive与controller通信</title> <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
</head>
<body>
<div ng-controller="democtrl2">
<!--给tag2赋值的时候要使用表达式-->
<mytag tag2="{{attrd}}"></mytag>
</div> </body>
</html>
js:
<script>
var demoapp = angular.module('demoapp', []); demoapp.controller('democtrl2', ['$scope', function($scope) { $scope.attrd = 'hello'; }]); //scope中tag2属性值为"@",将tag2作为字符串传递与页面中html实现关联
demoapp.directive('mytag', function() {
return {
restrict:"AE",
scope:{
tag2:'@'
},
template:"<div>{{tag2}}</div>"
};
}); </script>
这里首先在html页面中定义了<mytag></mytag>标签,然后定义tag2属性,然后将在controller中定义的attrd属性赋值给标签中的tag2属性。
然后在js中定义了一个mytag的一个指令,在scope中tag2属性值为"@",这样的话tag2的值就是页面中tag2={{attrd}}中的值,而attrd=“hello”。所以tag2=“hello”。其主要的作用是将<mytag></mytag>标签替换为template中的<div>{{tag2}}</div>。
其实等价于:
link:function(scope, element, attrs) {//scope为父controller中的scope,element为mytag,attrs为mytag中的属性
scope.tag2 = attrs.tag2;
}
其主要的流程是:
1.通过@实现指令与html页面元素进行关联。
2.在控制器中又实现了与页面的关联。
3.通过html实现了控制器和指令之间的联系。
2.指令作用域中的"="
作用:表示与父scope中的属性进行双向数据绑定
<!DOCTYPE html>
<html ng-app="demoapp">
<head lang="en">
<meta charset="UTF-8">
<title>angular-directive与controller通信</title> <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
</head>
<body>
<div ng-controller="democtrl2">
Ctrl:
<input type="text" ng-model="attrd2"/>
<br/>
Directive:
<mytag2 tag3="attrd2"></mytag2>
</div>
</body>
</html>
js:
var demoapp = angular.module('demoapp', []);
demoapp.controller('democtrl2', ['$scope', function($scope) {
$scope.attrd2 = 'hello2';
}]);
demoapp.directive('mytag2', function() {
return {
restrict:"AE",
scope:{
tag3:"="
},
template:"<input type='text' ng-model='tag3' />"
};
});
具体流程:
1.在html中定义了一个输入框ng-model绑定了controller中的attrd2,同时定义<mytag2></mytag2>标签,然后将controller中的attrd2赋值给tag3。
2.在指令中scope对象中tag3:"=",则表示与父scope中的属性进行双向数据绑定,具体绑定哪个mytag2标签中已经指定了。然后替换为tamplate中的标签显示。
3.通过"="实现了指定中的属性与父scope中的属性进行双向数据绑定,从而当改变一个值时达到互相影响对方的作用。
3.指令作用域中的"&"
作用:表示与父scope中的函数进行传递,稍后进行调用。
<!DOCTYPE html>
<html ng-app="demoapp">
<head lang="en">
<meta charset="UTF-8">
<title>angular-directive与controller通信</title> <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
</head>
<body>
<div ng-controller="democtrl2">
<mytag3 tagfn="attrd_fn(name)"></mytag3> <span>{{fruit}}</span> </div>
</body>
</html>
js:
var demoapp = angular.module('demoapp', []);
demoapp.controller('democtrl2', ['$scope', function($scope) {
//方法传入参数的名称和下面自定义的directive中对象的属性名称要一致
$scope.attrd_fn = function(name) {
$scope.fruit = name;
}
}]);
demoapp.directive('mytag3', function() {
return {
restrict:"AE",
scope:{
tagfn:"&" //属性不能有下划线
},
template:"<input type='text' ng-model='fruitname'/><button ng-click='tagfn({name:fruitname})'>水果名字</button>" //对象传入的属性名称和controller中方法传入的参数名称一致
};
});
具体流程:
1.页面中定义了<mytag3></mytag3>标签,标签中tagfn属性等于controller中定义的attrd_fn函数。
2.自定义mytag3指令中tagfn:"&"则表示directive与controller之间主要进行的是函数的传递。同时将页面上的标签替换为template中的内容。
3.通过页面中tagfn="attrd_fn(name)",template中ng-click时触发的tagfn函数来自controller中的attrd_fn;同时tagfn函数传入的是一个对象,对象的属性名字要和controller中attrd_fn函数中参数名字一致。
为达到简洁的效果我将页面的显示结果放到了一张图片展示,如下:

angularJS中directive与controller之间的通信的更多相关文章
- AngularJS进阶(九)控制器controller之间如何通信
AngularJS控制器controller之间如何通信 注:请点击此处进行充电! angular控制器通信的方式有三种: 1,利用作用域继承的方式.即子控制器继承父控制器中的内容 2,基于事件的方式 ...
- angularJS中directive与directive 之间的通信
上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被 ...
- AngularJS实战之Controller之间的通信
我们时常会在不同controller之间进行通信,接下来就介绍三种controller之间的通信方式 一.使用$on.$emit和$broadcast进行controller通信 虽然AngularJ ...
- angularJS中directive父子组件的数据交互
angularJS中directive父子组件的数据交互 1. 使用共享 scope 的时候,可以直接从父 scope 中共享属性.使用隔离 scope 的时候,无法从父 scope 中共享属性.在 ...
- AngularJS 中 Controller 之间的通信
用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文对此进行一个总结. 在 Angular 中,Controller 之间通信的方式主要有三种: 1)作用域继承.利 ...
- Angularjs controller之间的通信
刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: <html> <script src=" ...
- angularjs中directive指令与component组件有什么区别?
壹 ❀ 引 我在前面花了两篇博客分别系统化介绍了angularjs中的directive指令与component组件,当然directive也能实现组件这点毋庸置疑.在了解完两者后,即便我们知道co ...
- angularjs 中 Factory,Service,Provider 之间的区别
本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...
- Android中BroadCast与Activity之间的通信
在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...
随机推荐
- Bad Request - Request Too Long
Bad Request - Request Too Long HTTP Error 400. The size of the request headers is too long. 该错误原因导致 ...
- MySQL触发器使用详解
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器在MySQL中,创建触发器语法如下: ...
- ElasticSearch 自定义排序处理
使用function_score进行分组处理,利用分组函数script_score进行自定义分值处理, 注意:使用script功能需要在配置中打开脚本功能: script.inline: on s ...
- 源码阅读 etherum-block.py
def calc_difficulty(parent, timestamp): config = parent.config offset = parent.difficulty // config[ ...
- 首次用U盘安装CentOS
安之前看了这篇文章,http://www.osyunwei.com/archives/2307.html,然后就开始了. 首先下载ultraiso,官网下载的,将centos的iso镜像写到u盘上. ...
- java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)
import java.util.*; public class Person implements Comparable<Person>//使Person的属性具有比较性 { priva ...
- http的一些事
查找资料将http中缓存相关的知识记录下 一般来说:Last-Modifed和Expires是一对,ETag和Cache-Control是一对 Last-Modified Client端跟Server ...
- Java实现插入排序
package Sort; import java.util.Arrays; public class InsertionSort { public static int[] sort(int[] l ...
- [Android Tips] 25. ADB Command Note
copy from https://github.com/operando/Android-Command-Note Android Command Note Logcat adb logcat -v ...
- 初识Redis(1)
Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store). 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希( ...