AngularJS指令之 require 参数 的用法

require - 请求另外的controller,传入当前directive的link function中。require需要传入一个directive controller的名称。如果找不到这个名称对应的controller,那么将会抛出一个error。名称可以加入以下前缀:

? - 不要抛出异常。这使这个依赖变为一个可选项。

^ - 允许查找父元素的controller

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4          <meta name="viewport" content="width=device-width, initial-scale=1.0">
 5         <link rel="stylesheet" href="bootstrap.min.css">
 6         <script src="jquery.min.js"></script>
 7         <script src="angular.min.js"></script>
 8         <script src="bootstrap.min.js"></script>
 9         <script type="text/javascript">
10             var myapp = angular.module("myapp", []);
11             myapp.controller("MyController", [‘$scope‘, function($scope) {
12                 $scope.name = "mario";
13                 $scope.age = "13";
14                 $scope.send = function() {
15                     console.log(‘.............‘);
16                 };
17             }]);
18             myapp.directive("parent", function() {
19                 return {
20                     restrict: ‘E‘,
21                     scope:{},
22                     controller: function() {
23                         // this.data = [‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘];
24                         data = [‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘];
25                         this.click = function() {
26                             data.pop();
27                             console.log(data);
28                         };
29                     },
30                     link: function(scope, elem, attrs) {
31                         scope.name = ‘123‘;
32                     },
33                     template: ‘<span>{{name}}<div ng-transclude></div></span>‘,
34                     replace: true,
35                     transclude: true
36                 };
37             });
38             myapp.directive("son", function() {
39                 return {
40                     restrict: ‘E‘,
41                     repalce: true,
42                     require: ‘^?parent‘,
43                     template: ‘<div ng-click="sonClick()">sonClick</div>‘,
44                     link: function(scope, elem, atts, ctrl) {
45                         scope.sonClick = ctrl.click;
46                         // tmp = ctrl.data;
47                         // console.log(tmp);
48                         // ctrl.data.pop();
49                     }
50                 };
51             });
52             myapp.directive("daughter", function() {
53                 return {
54                     restrict: ‘E‘,
55                     repalce: true,
56                     require: ‘^?parent‘,
57                     template: ‘<div ng-click="daughterClick()">daughterClick</div>‘,
58                     link: function(scope, elem, atts, ctrl) {
59                         scope.daughterClick = ctrl.click;
60                         // tmp = ctrl.data;
61                         // console.log(tmp);
62                     }
63                 };
64             });
65         </script>
66         <style type="text/css">
67         </style>
68     </head>
69     <body ng-app="myapp">
70         <div class="container" ng-controller="MyController">
71             <parent>
72                 <son></son>
73                 <daughter></daughter>
74             </parent>
75         </div>
76     </body>
77 </html>

require之后可以在link中使用第四个参数ctrl调用到依赖的指令的controller中的方法变量.

可以看到son, daughter都可以调用到parent中的click函数,并且操作同一个data.可以发现click前面用this,修饰.

data如果也使用this.修饰,那么结果是一样的,可以被其依赖的指令使用ctrl.data访问到.

所以当几个指令有共同的方法时可以抽取到一个指令中,然后require一下.

上面的写法是

  <parent name="123">
      <son></son>
      <daughter></daughter>
 </parent>

按照上面的说法是使用父元素的controller,所以^不可少,写法也必须那么写才可以调到click函数.

补充

引入其他指令并注入到控制器中,并作为当前指令的链接函数的第四个参数。require使用字符串或数组元素来传入指令。如果是数组,注入的参数是一个相应顺序的数组。如果这样的指令没有被找到,或者该指令没有控制器, 就会报错。 require参数可以加一些前缀:

  • (没有前缀)如果没有前缀,指令将会在自身所提供的控制器中进行查找,如果没有找到任何控制器就抛出一个错误。
  • ? 如果在当前指令中没有找到所需要的控制器,会将null作为传给link函数的第四个参数。
  • ^ 如果添加了^前缀,指令会在上游的指令链中查找require参数所指定的控制器。
  • ?^ 将前面两个选项的行为组合起来,我们可选择地加载需要的指令并在父指令链中进行查找。
时间: 2024-08-10 21:29:08

AngularJS指令之 require 参数 的用法的相关文章

AngularJs 指令directive之require

controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编 写,使用起来比较简单:另一种方法则是require AngularJS内建的指令,其中大部分时间需要require的都是ngModel这个指令. 在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流.举个简单的例子,假如我们现在需要编写两 个指令,在linking函数中有很多重合的方法,为了避免重复自己

AngularJS指令参数详解

指令,很重要 AngularJS与jQuery最大的区别在哪里?我认为,表现在数据双向绑定,实质就是DOM的操作形式不一样. jquery通过选择器找到DOM元素,再赋予元素的行为: 而angularjs则是,将指令与DOM绑定在一起,再扩展指令的行为. 所以AngularJS开发最理想的结果就是,在页面HTML与CSS的设计时,设计工程师只需要关注指令的使用:而在背后的逻辑开发上,架构工程师则是不需要知道如何操作DOM,只需要关注指令背后的行为要如何实现就行:测试工程师也可以开发针对指令的单元

AngularJS指令进阶 -- ngModelController详解

大家都知道AngularJS中的指令是其尤为复杂的一个部分,但是这也是其比较好玩的地方.这篇文章我们就来说一说如何在我们自定义的指令中,利用ngModel的controller来做双向数据绑定,本文对大家学习AngularJS具有一定的参考借鉴价值,有需要的朋友们可以参考借鉴. 前言 在Angular应用中,ng-model指令时不可缺少的一个部分,它用来将视图绑定到数据,是双向绑定魔法中重要的一环.ngModelController则是ng-model指令中所定义的controller.这个c

angularJs指令深度分析

AngularJs的指令定义大致如下 angular.module("app",[]).directive("directiveName",function(){ return{ //通过设置项来定义 }; })其中return返回的对象包含很多参数,下面一一说明 你知道用AngularJs怎么定义指令吗? 1.restrict (字符串)可选参数,指明指令在DOM里面以什么形式被声明: 取值有:E(元素),A(属性),C(类),M(注释),其中默认值为A: E(元

AngularJS指令中的compile与link函数解析

AngularJS指令中的compile与link函数解析 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. 原文地址 angularjs里的指令非常神奇,允许你创建非常语义化以及高度重用的组件,可以理解为web components的先驱者. 网上已经有很多介绍怎么使用指令的文章以及相关书籍,相互比较的话,很少有介绍compile与link的区别,更别说pre-link与post-lin

angularjs指令中的compile详解

篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. angularjs里的指令非常神奇,允许你创建非常语义化以及高度重用的组件,可以理解为web components的先驱者. 网上已经有很多介绍怎么使用指令的

angularjs 指令—— 绑定策略(@、=、&amp;)

angularjs 指令—— 绑定策略(@.=.&) 引入主题背景:angular 的指令配置中的template可以直接使用硬编码写相应的代码,不过也可以根据变量,进行动态更新.那么需要用到那些变量,因用法的不同,所以需要设置合适的绑定策略. 一.@ 绑定策略 @ 绑定策略,它的作用就是能把指令配置的独立Scope下变量的值等于根据@绑定的指令属性的值.(指令属性的值可以使用表达式,但是得出来的值一定是字符串.) 1.上代码: html代码 <!DOCTYPE html> <h

【转】angularjs指令中的compile与link函数详解

这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. angularjs里的指令非常神奇,允许你创建非常语义化以及高度重用的组件,可以理解为web components的先驱者. 网上已经有很多介绍怎么使用指令

AngularJS指令的详解

指令作为AngularJS中最为重要的部分,所以这个框架本身也是自带了比较多的的指令,但是在开发中,这些指令通常不能满足我们的需要,所以我们也是需要自定义一些指令的.指令是我们用来扩展浏览器能力的技术之一.在DOM编译期间,和HTML元素关联着的指令会被检测到,并且被执行.这使得指令可以为DOM指定行为,或者改变它. angular在编译期间,编译器会用$interpolate服务去检查文本中是否嵌入了表达式.这个表达式会被当成一个监视器一样注册,并且作为$digest循环中的一部分,它会自动更