当我们在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之间的通信的更多相关文章

  1. AngularJS进阶(九)控制器controller之间如何通信

    AngularJS控制器controller之间如何通信 注:请点击此处进行充电! angular控制器通信的方式有三种: 1,利用作用域继承的方式.即子控制器继承父控制器中的内容 2,基于事件的方式 ...

  2. angularJS中directive与directive 之间的通信

    上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被 ...

  3. AngularJS实战之Controller之间的通信

    我们时常会在不同controller之间进行通信,接下来就介绍三种controller之间的通信方式 一.使用$on.$emit和$broadcast进行controller通信 虽然AngularJ ...

  4. angularJS中directive父子组件的数据交互

    angularJS中directive父子组件的数据交互 1. 使用共享 scope 的时候,可以直接从父 scope 中共享属性.使用隔离 scope 的时候,无法从父 scope 中共享属性.在 ...

  5. AngularJS 中 Controller 之间的通信

    用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文对此进行一个总结. 在 Angular 中,Controller 之间通信的方式主要有三种: 1)作用域继承.利 ...

  6. Angularjs controller之间的通信

    刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: <html> <script src=" ...

  7. angularjs中directive指令与component组件有什么区别?

     壹 ❀ 引 我在前面花了两篇博客分别系统化介绍了angularjs中的directive指令与component组件,当然directive也能实现组件这点毋庸置疑.在了解完两者后,即便我们知道co ...

  8. angularjs 中 Factory,Service,Provider 之间的区别

    本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...

  9. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

随机推荐

  1. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  2. CSS使用position定位后导致元素浮动

    1.子元素 absolute/fixed定位后,子元素脱离文档流存在,它让出原来占的那个坑,父元素再也不能通过子元素来撑开高度了 <style> div{ position:absolut ...

  3. Python学习【第九篇】函数

    函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...

  4. mysql 主从

    1.首先 主库创建二进制数据访问账户(账户:repl 密码:repl@01) GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to repl@'% ...

  5. 树状sql--采用递归方式获取节点

    创建数据库 create table City(id varchar(3) primary key , pid varchar(3) , name varchar(10)) 插入数据 insert i ...

  6. ios-深度解析二维码的生成与使用

    利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面)   一.二维码的介绍   1.什么是二维码?        二维条码/二维码是用某种特定的 ...

  7. asp.net mvc 5 web api 关于Requested resource does not support options 问题

    1.用visual studio 2015 建立一个 web api 应用程序.记住这是一个 web api 应用. 2.新建一个web api . 3.用C#访问,代码如下:[没有问题,返回正确] ...

  8. 解决Android与服务器交互大容量数据问题

    对于目前的状况来说,移动终端的网络状况没有PC网络状况那么理想.在一个Android应用中,如果需要接收来自服务器的大容量数据,那么就不得不考虑客户的流量问题.本文根据笔者的一个项目实战经验出发,解决 ...

  9. 列表边框column-rule

    column-rule主要是用来定义列与列之间的边框宽度.边框样式和边框颜色.简单点说,就有点类似于常用的border属性.但column-rule是不占用任何空间位置的,在列与列之间改变其宽度不会改 ...

  10. 1047: 小A的计算器

    1047: 小A的计算器 时间限制: 1 Sec  内存限制: 128 MB提交: 124  解决: 105[提交][状态][讨论版] 题目描述 以往的操作系统内部的数据表示都是二进制方式,小A新写了 ...