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 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...
随机推荐
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- Centos下防止暴力破解密码 - Denyhost
参考: http://www.centoscn.com/shell/2015/0703/5781.html 从http://sourceforge.net/projects/denyhosts/fil ...
- warnin php startup in unknown on line 0:
PHP Warning: PHP Startup: in Unknown on line 0 这种情况是因为扩展路径有问题导致的路径或错,或没有该扩展但ini中开启了此扩展
- JAVASE02-Unit03: 日期操作 、 集合框架
Unit03: 日期操作 . 集合框架 java.util.Date package day03; import java.util.Date; /** * java.util.Date * Date ...
- ASP.NET MVC WEB API字段出现k__BackingField
参考博客:C#对 Json的序列化和反序列化会出现"k_BackingField"
- LUA5.3的BNF范式学习笔记
BNF巴科斯范式 {A} 表示 0 或多个 A , [A] 表示一个可选的 A chunk ::= block block ::= {stat} [retstat] stat ::= ‘;’ ...
- git tag — 标签相关操作
标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ Git tag # 在控制台打印出当前仓库的所有标签$ git tag -l 'v0.1.*' # 搜索符合模式的标签 打标签 gi ...
- ubuntu安装使用GitHub--PC端
按照这个步骤安装并且初步使用 按照这个程序配置git的ssh,在git push时不用输入密码
- 如何创建一个简单的C++同步锁框架(译)
翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...
- Leetcode: Design Phone Directory
Design a Phone Directory which supports the following operations: get: Provide a number which is not ...