发表于: 2017-07-04 20:49:10

1 932


今天完成的事情:

今天又搞了一整天的小课堂,新的题目,没人做过,恰好我也不怎么懂,先学现卖。


明天计划的事情:

明天优化代码,做PPT,准备一些进复盘的事情


遇到的问题:

做小课堂,没遇到什么卡住的问题


收获:

Directive是AngularJ非常强大而有有用的功能之一。你可以在它的基础上来操作scope、绑定事件、更改样式等。通过这个Directive,我们可以封装很多公共指令,比如分页指令、自动补全指令等等。然后在HTML页面里只需要简单的写一行代码就可以实现很多强大的功能。一般情况下,需要用Directive有下面的情景:

1.使你的Html更具语义化,不需要深入研究代码和逻辑即可知道页面的大致逻辑。

2.抽象一个自定义组件,在其他地方进行重用。

今天重点讲解一下里面的compile和link属性

2.知识剖析

说到Directive指令,我们要先了解下Angular初始化的过程:

1脚本加载:加载Angular,

2查找ng-app:标识符找到应用绑定

3编译阶段:在这一阶段,Angular遍历DOM标识模板中所有注册的标志。对于每个标识符,基于标 识符规则(template,replace,transclude等等)改造DOM,然后如果编译函数存在就调用 它。结果是一个编译的template函数,它会调用从所有的标志符中搜集的link函数,compile就是这个阶段执行的,一般不推荐使用,会覆盖原有的compile

4链接阶段:为了让视图动起来,然后Angular为每个标识符运行link函数。Link函数通常在DOM或模型上创建监听器。这些监听器让视图和模型始终保持一致。

先看一段代码,代码是一个较为完整的模板

var myModule = angular.module(...);

myModule.directive('directiveName', function factory(injectables) {

return{

priority: 0,//优先级

template: '

',//需要添加的dom

templateUrl: 'directive.html',//把html写成独立的页面加载进来

replace: false,

transclude: false,

controller: 'SomeController'

restrict: 'A',//匹配类型(EAMC)

scope: false,//作用域类型

compile: function compile(tElement, tAttrs, transclude) {

return {

pre: function preLink(scope, iElement, iAttrs, controller) { ... },

post: function postLink(scope, iElement, iAttrs, controller) { ... }

}

},

link: function postLink(scope, iElement, iAttrs) { ... }

};

});

3.常见问题

link的四个参数分别是什么意思,怎么去用

4.解决方案

function link(scope, Element, Attrs, controller) { ... }

链接函数负责注册DOM事件和更新DOM。它是在模板被克隆之后执行的,它也是大部分指令逻辑代码编写的地方。

scope:指令需要监听的作用域。

Element:指令所在的元素。只有在postLink函数中对元素的子元素进行操作才是安全的,因为那时它们才已经全部链接好。

Attrs:实例属性,一个标准化的、所有声明在当前元素上的属性列表,这些属性在所有链接函数间是共享的。

controller:控制器实例,也就是当前指令通过require请求的指令direct2内部的controller。比如:direct2指令中的controller:function(){this.addStrength = function(){}},那么,在当前指令的link函数中,你就可以通过controller.addStrength进行调用了。

5.编码实战

6.扩展思考

require是怎么用的?

varapp=angular.module('myApp',[]);

app.directive('outerDirective',function(){

return{

scope:{},

restrict:'AE',

controller:function($scope){

this.say=function(someDirective){

console.log('Got:'+someDirective.message);

};}};});

app.directive('innerDirective',function(){

return{

scope:{},

restrict:'AE',

require:'^outerDirective',

link:function(scope,elem,attrs,controllerInstance){

scope.message="Hi,leifeng";

controllerInstance.say(scope);

}};});

app.directive('innerDirective2',function(){

return{

scope:{},

restrict:'AE',

require:'^outerDirective',

link:function(scope,elem,attrs,controllerInstance){

scope.message="Hi,shushu";

controllerInstance.say(scope);

}};});

另外我们可以在require的参数值加上下面的某个前缀,这会改变查找控制器的行为:

(1)没有前缀,指令会在自身提供的控制器中进行查找,如果找不到任何控制器,则会抛出一个error

(2)?如果在当前的指令没有找到所需的控制器,则会将null传给link连接函数的第四个参数

(3)^如果在当前的指令没有找到所需的控制器,则会查找父元素的控制器

(4)?^组合

参考文献

angular权威教程pdf

AngularJS指令参数详解

8.更多讨论

什么时候用controller,什么时候用link

上面例子中的指令innerDirective和指令innerDirective2复用了定义在指令outerDirective的controller中的方法

也进一步说明了,指令中的controller是用来让不同指令间通信用的。

鸣谢

感谢大家观看

BY :隋鑫



返回列表 返回列表
评论

    分享到