Directive究竟是个怎么样的一个东西呢?我个人的理解是这样的:将一段html、js封装在一起,形成一个可复用的独立个体,具体特定的功能。下面我们来详细解读一下Directive的一般性用法。
var myDirective = angular.module(‘directives‘, []); myDirective.directive(‘directiveName‘, function($inject) { return { template: ‘<div></div>‘, replace: false, transclude: true, restrict: ‘E‘, scope: {}, controller: function($scope, $element) { }, complie: function(tElement, tAttrs, transclude) { return { pre: function preLink(scope, iElement, iAttrs, controller) { }, post: function postLink(scope, iElement, iAttrs, controller) { } }; }, link: function(scope, iElement, iAttrs) { } };});这里直接return了一个object,对象中包括比较多的属性,这些属性都是对自定义directive的定义。
name
表示当前scope的名称,一般声明时使用默认值,不用手动设置此属性。priority
优先级。当有多个directive定义在同一个DOM元素上时,有时需要明确他们的执行顺序。这个属性用于在directive的compile function调用之前进行排序。如果优先级相同,则执行顺序是不确定的(根据经验,优先级高的先执行,相同优先级时按照先绑定后执行)。teminal
最后一组。如果设置为true
,则表示当前的priority将会成为最后一组执行的directive,即比此directive的priority更低的directive将不会执行。同优先级依然会执行,但是顺序不确定。scope
true
将为这个directive创建一个新的scope。如果在同一个元素中有多个directive需要新的scope的话,它还是只会创建一个scope。新的作用域规则不适用于根模版,因为根模版往往会获得一个新的scope。{}
将创建一个新的、独立的scope,此scope与一般的scope的区别在于它不是通过原型继承于父scope的。这对于创建可复用的组件是很有帮助的,可以有效的防止读取或者修改父级scope的数据。这个独立的scope会创建一个拥有一组来源于父scope的本地scope属性hash集合。这些本地scope属性对于模版创建值的别名很有帮助。本地的定义是对其来源的一组本地scope property的hash映射。
controller
controller构造函数。controller会在pre-linking步骤之前进行初始化,并允许其他directive通过指定名称的require进行共享。这将允许directive之间相互沟通,增强相互之间的行为。controller默认注入了以下本地对象:$scope
与当前元素结合的scope$element
当前的元素$attrs
当前元素的属性对象$transclude
一个预先绑定到当前scope的转置linking function
require
请求另外的controller,传入当前directive的linking function中。require需要传入一个directive controller的名称。如果找不到这个名称对应的controller,那么将会抛出一个error。名称可以加入以下前缀:?
不要抛出异常。这将使得这个依赖变为一个可选项^
允许查找父元素的controller
restrict
EACM的子集的字符串,它限制了directive为指定的声明方式。如果省略的话,directive将仅仅允许通过属性声明E
元素名称:A
属性名:
C
class名:
M
注释:
template
如果replace
为true,则将模版内容替换当前的html元素,并将原来元素的属性、class一并转移;如果replace
为false,则将模版元素当作当前元素的子元素处理。templateUrl
与template基本一致,但模版通过指定的url进行加载。因为模版加载是异步的,所有compilation、linking都会暂停,等待加载完毕后再执行。replace
如果设置为true,那么模版将会替换当前元素,而不是作为子元素添加到当前元素中。(为true时,模版必须有一个根节点)transclude
编译元素的内容,使它能够被directive使用。需要在模版中配合ngTransclude
使用。transclusion的有点是linking function能够得到一个预先与当前scope绑定的transclusion function。一般地,建立一个widget,创建独立scope,transclusion不是子级的,而是独立scope的兄弟级。这将使得widget拥有私有的状态,transclusion会被绑定到父级scope中。(上面那段话没看懂。但实际实验中,如果通过调用myDirective,而transclude设置为true或者字符串且template中包含的时候,将会将的编译结果插入到sometag的内容中。如果any的内容没有被标签包裹,那么结果sometag中将会多了一个span。如果本来有其他东西包裹的话,将维持原状。但如果transclude设置为’element’的话,any的整体内容会出现在sometag中,且被p包裹)- true/false 转换这个directive的内容。(这个感觉上,是直接将内容编译后搬入指定地方)
- ‘element’ 转换整个元素,包括其他优先级较低的directive。(像将整体内容编译后,当作一个整体(外面再包裹p),插入到指定地方)
compile
这里是compile function,将在下面实例详细说明link
这里是link function ,将在下面实例详细讲解。这个属性仅仅是在compile属性没有定义的情况下使用。
参考地址:http://blog.gejiawen.com/2014/07/16/usage-for-angularjs-directive/ 先上指令的模板。可以看出,指令包含一个输入框一个下拉选择框。
指令的逻辑部分:
参考地址:http://blog.gejiawen.com/2015/12/20/using-ng-model-controller-with-angular-directive/?utm_source=tuicool&utm_medium=referral
时间: 2024-10-20 09:37:46