zoukankan      html  css  js  c++  java
  • angularJS中directive与directive 之间的通信

    上一篇讲了directive与controller之间的通信;但是我们directive与directive之间的通信呢?

    当我们两个directive嵌套使用的时候怎么保证子directive不会被父directive替换覆盖;及当子directive需要用到父directive中controller某个变量或者方法的时候

    怎么实现两个directive之间的通信的。

    这里主要讲directive的两个属性:

    1.transclude

    2.require

    html

     1 <!DOCTYPE html>
     2 <html>
     3 <head lang="en">
     4     <meta charset="UTF-8">
     5     <title>angular-directive3</title>
     6     <script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
     7     <style type="text/css">
     8         #id1 {
     9             width: 200px;
    10             height: 100px;
    11             border: 1px solid #005599;
    12         }
    13         #id2 {
    14             width: 100px;
    15             height: 50px;
    16             margin: 5px;
    17             border: 1px dotted #cccccc;
    18         }
    19     </style>
    20 </head>
    21 <body ng-app="demoDrt">
    22 
    23 <deep-drt forid="id1">
    24     <inner-drt forinnerid="id2"></inner-drt>
    25 </deep-drt>
    26 
    27 </body>
    28 </html>

    js

     1 var demoDrt = angular.module('demoDrt', []);
     2     demoDrt.directive('deepDrt', function() {
     3         return {
     4             restrict:'AE',
     5             replace:true,
     6             scope : {
     7                 forid : '@'
     8             },
     9             //加上transclude属性true之后在template中结合ng-transclude指令就不会替换子directive,
    10             // 如果嵌套有自定义指令而没加transclude属性的话子directive会被父directive的template替换掉
    11             transclude:true,
    12             //如果有子directive要使用父directive中controller的值的话变量和函数的定义则要使用this来绑定,$scope绑定的话只会在当前作用域生效
    13             controller:['$scope', function($scope) {
    14                 //这个this输出的其实就是controller对象
    15                 this.name = 'angular';
    16                 this.version = '1.4.6';
    17             }],
    18             //template 上结合ng-transclude使用,如果ng-transclude放在template的父级的话,
    19             // 那么template里面的值会被子directive覆盖,所以我们要用一个dom并加上ng-transclude来在外层包裹子directive。
    20             template:'<div id="{{forid}}">deepDrt<div ng-transclude></div></div>'
    21         };
    22     });
    23 
    24     demoDrt.directive('innerDrt', function() {
    25        return {
    26            restrict:"AE",
    27            replace:true,
    28            //require主要作用是寻找父directive,'^'表示向上寻找,后面加上父directive的名字,'?'表示如果找不到的话则不会报错,
    29            // 一般'^?'两个结合使用当找不到父directive的时候angular不会报错
    30            //结合了require 则在子directive的link属性中加上reController,则可以获取父directive中controller的变量和方法
    31            require: '^?deepDrt',
    32            scope : {
    33                forinnerid : '@'
    34            },
    35            link : function(scope, element, attr, reController) {
    36                console.log(scope);
    37                console.log(attr);
    38                //reController得到了父controller中绑定的变量和函数
    39                element.bind('click', function(e) {
    40                   console.log(e.target);
    41                    e.target.innerText = reController.name + '-' + reController.version;
    42                });
    43            },
    44            template : '<div id="{{forinnerid}}">innerDrt</div>'
    45        }
    46     });

    directive生成页面结构

    通过transclude:true同时在template中结合ng-transclude指令我们能把子directive嵌套在父directive中;而我在注释中也提到了,如果ng-transclude外没有一个dom包裹

    子directive的话那字directive也是会被父directive的template替换的。

    在子directive中require:'^?deepDrt';具体含义在注释中已经说明。值得注意的是父directive中的controller中定义的变量如果要给子directive使用的话要用this来绑定变量或者方法,this指的就是controller这个对象。子directive中reController得到的就是这个controller对象,从而得到父directive中this定义的变量和属性。

    关于angularJS directive之间的通信就这么多;不对之处希望大家指正。谢谢!

  • 相关阅读:
    好兴奋,我的博客终于上线了
    学技术,该怎么看书
    PHP程序员求职经验总结
    Jquery中extend使用技巧
    JavaScript(JS)实现省市联动选择下拉列表
    银行家算法之JavaScript实现
    JS中的两种刷新方法以及区别和适用范围
    一段上传图片预览JS脚本,Input file图片预览的实现
    本博客模板说明
    深圳,想说爱你不容易!
  • 原文地址:https://www.cnblogs.com/leungUwah/p/6195906.html
Copyright © 2011-2022 走看看