angularJS中directive与controller之间的通信

当我们在angularJS中自定义了directive之后需要和controller进行通讯的时候,是怎么样进行通讯呢?

这里介绍3种angular自定义directive与controller通信的指令。

1.指令作用域中的"@"

作用:把当前属性作为字符串传递实现指令与html页面元素关联。

 1 <!DOCTYPE html>
 2 <html ng-app="demoapp">
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>angular-directive与controller通信</title>
 6
 7     <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
 8 </head>
 9 <body>
10    <div ng-controller="democtrl2">
11         <!--给tag2赋值的时候要使用表达式-->
12         <mytag tag2="{{attrd}}"></mytag>
13     </div>
14
15 </body>
16 </html>

js:

 1 <script>
 2     var demoapp = angular.module(‘demoapp‘, []);
 3
 4     demoapp.controller(‘democtrl2‘, [‘$scope‘, function($scope) {
 5
 6         $scope.attrd = ‘hello‘;
 7
 8     }]);
 9
10     //scope中tag2属性值为"@",将tag2作为字符串传递与页面中html实现关联
11     demoapp.directive(‘mytag‘, function() {
12         return {
13             restrict:"AE",
14             scope:{
15                 tag2:‘@‘
16             },
17             template:"<div>{{tag2}}</div>"
18         };
19   });
20
21 </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>。

其实等价于:

1 link:function(scope, element, attrs) {//scope为父controller中的scope,element为mytag,attrs为mytag中的属性
2     scope.tag2 = attrs.tag2;
3 }

其主要的流程是:

1.通过@实现指令与html页面元素进行关联。

2.在控制器中又实现了与页面的关联。

3.通过html实现了控制器和指令之间的联系。

2.指令作用域中的"="

作用:表示与父scope中的属性进行双向数据绑定

 1 <!DOCTYPE html>
 2 <html ng-app="demoapp">
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>angular-directive与controller通信</title>
 6
 7     <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
 8 </head>
 9 <body>
10 <div ng-controller="democtrl2">
11     Ctrl:
12     <input type="text" ng-model="attrd2"/>
13     <br/>
14     Directive:
15     <mytag2 tag3="attrd2"></mytag2>
16 </div>
17 </body>
18 </html>

js:

 1 var demoapp = angular.module(‘demoapp‘, []);
 2
 3         demoapp.controller(‘democtrl2‘, [‘$scope‘, function($scope) {
 4
 5             $scope.attrd2 = ‘hello2‘;
 6
 7         }]);
 8 demoapp.directive(‘mytag2‘, function() {
 9            return {
10                restrict:"AE",
11                scope:{
12                    tag3:"="
13                },
14                template:"<input type=‘text‘ ng-model=‘tag3‘ />"
15            };
16         });

具体流程:

1.在html中定义了一个输入框ng-model绑定了controller中的attrd2,同时定义<mytag2></mytag2>标签,然后将controller中的attrd2赋值给tag3。

2.在指令中scope对象中tag3:"=",则表示与父scope中的属性进行双向数据绑定,具体绑定哪个mytag2标签中已经指定了。然后替换为tamplate中的标签显示。

3.通过"="实现了指定中的属性与父scope中的属性进行双向数据绑定,从而当改变一个值时达到互相影响对方的作用。

3.指令作用域中的"&"

作用:表示与父scope中的函数进行传递,稍后进行调用。

 1 <!DOCTYPE html>
 2 <html ng-app="demoapp">
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>angular-directive与controller通信</title>
 6
 7     <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
 8 </head>
 9 <body>
10 <div ng-controller="democtrl2">
11     <mytag3 tagfn="attrd_fn(name)"></mytag3>
12
13     <span>{{fruit}}</span>
14
15 </div>
16 </body>
17 </html>

js:

 1 var demoapp = angular.module(‘demoapp‘, []);
 2
 3        demoapp.controller(‘democtrl2‘, [‘$scope‘, function($scope) {
 4
 5             //方法传入参数的名称和下面自定义的directive中对象的属性名称要一致
 6             $scope.attrd_fn = function(name) {
 7                  $scope.fruit = name;
 8              }
 9
10         }]);
11
12         demoapp.directive(‘mytag3‘, function() {
13             return {
14                 restrict:"AE",
15                 scope:{
16                     tagfn:"&" //属性不能有下划线
17                 },
18                 template:"<input type=‘text‘ ng-model=‘fruitname‘/><button ng-click=‘tagfn({name:fruitname})‘>水果名字</button>" //对象传入的属性名称和controller中方法传入的参数名称一致
19
20             };
21         });        

具体流程:

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函数中参数名字一致。

为达到简洁的效果我将页面的显示结果放到了一张图片展示,如下:

时间: 2024-07-28 22:52:01

angularJS中directive与controller之间的通信的相关文章

angularJS中directive与directive 之间的通信

上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被父directive替换覆盖:及当子directive需要用到父directive中controller某个变量或者方法的时候 怎么实现两个directive之间的通信的. 这里主要讲directive的两个属性: 1.transclude 2.require html 1 <!DOCTYPE ht

angularjs中directive声明scope对象时修饰符解释和用法

在angular中我们定义directive方法时,可以看到 return { restrict: 'AE', scope: {}, template: '<div></div>', link: function() {} } 除了代码中出现的属性,还有一些其他的属性可供配置,这里不作详述. 今天我们要说的重点是scope字段. 常规用法设置 scope: { name: '=', age: '=', sex: '@', say: '&' } 假设我们的hml代码如下 &l

android中fragment和activity之间相互通信

在用到fragment的时候,老是会遇到一个问题,就是fragment与activity之间的通信.下面就来记录一下activity和fragment之间 通过实现接口来互相通信的方法. 1. activity 向fragment发出通信,就这么写: private OnMainListener mainListener; // 绑定接口 @Override public void onAttachFragment(Fragmentfragment) { try { mainListener =

AngularJS 中 Controller 之间的通信

用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文对此进行一个总结. 在 Angular 中,Controller 之间通信的方式主要有三种: 1)作用域继承.利用子 Controller 控制父 Controller 上的数据.(父 Controller 中的数据要为引用类型,不能是基本类型,原因参见 AngularJS中的作用域 一文) 2)注入服务.把需要共享的数据注册为一个 service,在需要的 Controller 中注入. 3)基于事件.利用

Angularjs controller之间的通信

刚刚看了网上的一些关于控制器之间的通信:然后结合自己项目做了一些,这里主要做的是二个同级之间的controller通信. Html: 1 <html> 2 <script src="http://apps.bdimg.com/libs/angular.js/1.3.9/angular.min.js"></script> 3 <body> 4 <div ng-app="app"> 5 <div ng-c

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

本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行演示 Factory,Service,Provider 之间的区别 1. Factory factory('dataService',function(){ return { golbal_sitename:"this is the shared value", sayHello:func

AngularJS自定义Directive与controller的交互

有时候,自定义的Directive中需要调用controller中的方法,即Directive与controller有一定的耦合度. 比如有如下的一个controller: app.controller('MyCtrl',function($scope){ $scope.load = function(){ console.log('loading more...') } }); 现在自定义一个Direcitve,需要调用MyCtrl这个controller中的load方法. app.direc

Android中两个Activity之间简单通信

在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信息的发起者为Test,接收者为Target,代码如下: Test类: 1 package com.example.testsend; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivit

Android中BroadCast与Activity之间的通信

在看本文之前,如果你对于Android的广播机制不是很了解,建议先行阅读我转载的一篇博文:图解 Android 广播机制. 由于本案例比较简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: MainActivity的代码如下: package com.gc.testbroadcasedemo; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Cont