require
?
如果在当前指令中没有找到所需的控制器,就会将 null 传递给 link 函数中的第四个参数
^
如果添加了这个前缀,指令会在上游的指令链中查找 require 参数所指定的控制器
?^
合并了前面两个说法
没有前缀 指令就会自身提供的控制器中查找,如果没有查找到,就会抛出异常来。
link 对于 link 与 scope scope,我们需要用到一个 link 函数,他由指令定义对象中的 link 属性配置。
1 2 3 4 5 6 link:function (scope,elem,attrs ) { }
所以说:link
函数主要是为 dom 元素添加事件监听,监听模型属性变化,以及更新 dom。 另外如果有参数 require
的话,对于 link 函数方面就会多一个参数 controller
1 2 3 4 5 6 { require :'?ngModal' ,link:function (scope,element,attrs,ctrl ) { } }
如果 require 的参数是数组的话。
1 2 3 4 5 6 7 8 { require :['?ngModal' ,'?test' ],link:function (scope,element,attrs,ctrls ) { var modalCtrl = ctrls[0 ]; var testCtrl = ctrls[1 ]; } }
controller 类型:字符串或者函数
若是为字符串,则将字符串当做是控制器的名字,来查找注册在应用中的控制器的构造函数。
1 2 3 4 5 6 7 8 9 10 angular.module('myApp' , []) .directive('myDirective' , function ( ) { restrict: 'A' , controller: 'SomeController' }) angular.module('myApp' ) .controller('SomeController' , function ($scope, $element, $attrs, $transclude ) { });
若为匿名函数,直接在指令内部的定义为匿名函数,同样我们可以再这里注入任何服务($log,$timeout 等等)
1 2 3 4 5 6 7 8 angular.module('myApp' ,[]) .directive('myDirective' , function ( ) { restrict: 'A' , controller: function ($scope, $element, $attrs, $transclude ) { } });
另外还有一些特殊的服务(参数)可以注入:
$scope
,与指令元素相关联的作用域
$element
,当前指令对应的 元素
$attrs
,由当前元素的属性组成的对象
$transclude
,嵌入链接函数,实际被执行用来克隆元素和操作 DOM 的函数 注意: 除非是用来定义一些可复用的行为,一般不推荐在这使用$transclude
。 指令的控制器和 link 函数(后面会讲)可以进行互换。区别在于,控制器主要是用来提供可在指令间复用的行为但 link 链接函数只能在当前内部指令中定义行为,且无法再指令间复用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 angular.module('myApp' , []).directive('mySite' , function ( ) { return { restrict: 'EA' , transclude: true , controller: function ($scope, $element, $attrs, $transclude, $log ) { $transclude(function (clone ) { var a = angular.element('<a>' ) a.attr('href' , $attrs.site) a.text(clone.text()) $element.append(a) }) $log.info('hello everyone' ) } } })
HTML 代码为:
1 <my-site site ="http://www.cnblogs.com/cunjieliu" > 雷锋叔叔的博客</my-site >
controller 函数与 require 如果你需要允许其他指令和你的指令发生交互的话,你需要使用 controller 函数,比如有些情况下,你需要通过组合两个指令来实现一个 ui 组件,那么你可以通过如下使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 app.directive('outerDirective' , function ( ) { return { scope: {}, restrict: 'AE' , controller: function ($scope, $compile, $http ) { this .addChild = function (nestedDirective ) { console .log( 'Got the message from nested directive:' + nestedDirective.message ) } } } })
当另外一个指令需要使用到这个 controller 的时候
1 2 3 4 5 6 7 8 9 10 11 12 13 14 app.directive('innerDirective' , function ( ) { return { scope: {}, restrict: 'AE' , require : '^outerDirective' , link: function (scope, elem, attrs, controllerInstance ) { scope.message = 'Hi, Parent directive' controllerInstance.addChild(scope) } } })