Web 前端开发 我爱编程WEB前端程序开发

AngularJS学习--Directives

2018-03-10  本文已影响0人  belllee

Directives是什么?

AngularJS Directives是DOM元素(例如属性,元素名,注释或CSS类)上的标记,它告诉AngularJS的 html 编译器($compile) 把特定的操作连接到DOM元素或转化为DOM元素及其子元素,使元素拥有某些特定的行为。指令是所有AngularJS应用最重要的部分。尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令。

什么时候需要用Directives?

不要滥用Directives,如下一些场合需要考虑使用:

  1. 当某些元素或者元素组合以及其行为,需要在多个页面或者位置重复使用时;
  2. 引用其他jQuery组件,并且在加载数据后需要进行初始化时;

使用Directives的好处

  1. 去除重复代码
  2. 使得HTML更具可读性 例如:
//未使用指令时,无法知道该文本框的作用,需要查看JS代码。
<input type="text" />
//使用指令后,根据指令可得知是时间输入框。显然后者更清晰明了。
<input type="text" data-date-picker />

注意:如果不涉及DOM定义,也可以考虑使用serivces

Directives有哪些形式?

AngularJS中有四种类型的自定义指令:

  1. 元素指令 E
<data-my-directive></ data-my-directive>
  1. 属性指令 A
<div data-my-attr></div>
  1. CSS class 指令 C
<div class="my-class"></div>
  1. 注释指令 M
 <!– directive:my-comment -- >

Directives的命名

如果要符合HTML5的规范,可以在元素前面添加 x- 或者 data-的前缀。在匹配指令的时候,Angular会在元素或者属性的名字中剔除 x- 或者 data- 前缀。 然后将 – 或者 : 连接的字符串转换成驼峰(camelCase)现形式,然后再与注册过的指令进行匹配。例如:

//指令定义
app.directive('helloWorld', function() {})

//指令应用
<div data-hello-world></div>

当然,如果不需要符合HTML5规范,不可以加x- 或者 data- 前缀,一样可以正常使用。

Directives初体验

指令示例如下,

//指令定义
angular.module(‘app‘,[])
.directive('helloWorld', function() {
  return {
      restrict: 'AE',
      replace: 'true',
      template: '<h3>Hello World!!</h3>'
  };
});

//指令应用
<div hello-world></div>

Directive的基本属性说明:

Directive的属性——link:

如果我们要为DOM元素添加事件监听、监听模型属性变化、以及更新DOM等等行为时,就需要使用link属性。

link: function(scope, element , attrs)  {
        //dosomething
    }

参数说明:

Directive的属性——compile:

    compile: function(element, attrs) {
        //dosomething
    }

compile 函数在 link 函数被执行之前用来做一些DOM改造。它接收下面的参数:

要注意的是 compile 函数不能访问 scope,并且必须返回一个 link 函数。但是如果没有设置 compile 函数,你可以正常地配置 link 函数,(有了compile,就不能用link,link函数由compile返回)。

大多数的情况下,你只需要使用 link 函数。这是因为大部分的指令只需要考虑注册事件监听、监视模型、以及更新DOM等,这些都可以在 link 函数中完成。 但是对于像 ng-repeat 之类的指令,需要克隆和重复 DOM 元素多次,在 link 函数执行之前由 compile 函数来完成。这就带来了一个问题,为什么我们需要两个分开的函数来完成生成过程,为什么不能只使用一个?要回答好这个问题,我们需要理解指令在Angular中是如何被编译的。

指令是如何被编译的?

当应用引导启动的时候,Angular开始使用 $compile 服务遍历DOM元素。这个服务基于注册过的指令在标记文本中搜索指令。一旦所有的指令都被识别后,Angular执行他们的 compile 方法。如前面所讲的,compile 方法返回一个 link 函数,被添加到稍后执行的 link 函数列表中。这被称为编译阶段。如果一个指令需要被克隆很多次(比如 ng-repeat),compile函数只在编译阶段被执行一次,复制这些模板,但是link 函数会针对每个被复制的实例被执行。所以分开处理,让我们在性能上有一定的提高。这也说明了为什么在 compile 函数中不能访问到scope对象。 在编译阶段之后,就开始了链接(linking)阶段。在这个阶段,所有收集的 link 函数将被一一执行。指令创造出来的模板会在正确的scope下被解析和处理,然后返回具有事件响应的真实的DOM节点。

Directive的属性——scope:

创建指令的作用范围,scope在指令中作为属性标签传递。scope 是创建可以复用指令的必要条件,每个指令(不论是处于嵌套指令的哪一级)都有其唯一的作用域,它不依赖于父scope。
scope与父scope的关系可以分为隔离和继承两种。

非完全隔离场景下又存在如下3种继承关系:

scope: {
    name : '@',
    age : '=',
    doUpdate : '&'
}

注意:指令应用时,继承的属性名称必须使用-连接单词,不能用驼峰命名。

<div my-directive do-update="doUpdate"><div>
上一篇下一篇

猜你喜欢

热点阅读