自定义指令编译步骤

<图为一个元素上有2个指令的情况>

把指令标签转换为dom结构,执行complie方法,compile方法返回的就是Link函数,所以如果指令配置了compile方法,就不需要再配置Link方法了,

compile方法有3个参数tElement,tAttrs,transclude,tElement是该指令标签的JQuery对象,transclude是原始数据里的内容

compile:function(tElement,tAttrs,transclude){

  tElement.append(angular.element("<div>content</div>"));//这种方式可以给该标签增加内容

  return {pre:function(scope,iElement,iAttrs,controller){},post:function(scope,iElement,iAttrs,controller){}}//这就是Link方法,它包含两个属性,pre指在指令连接到子元素之前运行该方法,post指令连接到子元素之后运行该方法

}

一般compile方法用来改变dom结构,link方法用来给该指令元素绑定事件,Link方法包含4个参数scope,iElement,iAttrs,controller

Link:function(scope,iElement,iAttrs,ctrlname){//scope是当前指令元素的作用域,ctrlname是该指令元素的控制器名

  iElement.on('click',function(){

    scope.$apply(function(){ //在控制器里改变视图模板里的内容必须用脏检查$apply方法,除非该元素用了ng-model指令绑定了数据

        scope.user.name='new name';

    })

  })

}

指令的配置对象里还有一个controller属性

controller:function($scope){};//给该指令元素创建一个控制器

controllerAs:'ctrlname';//给该控制器取一个名字

原文地址:https://www.cnblogs.com/toward-the-sun/p/4264370.html