AngularJS 指令解析(二)


第一篇我们讲过了作用域(scope)这块内容,现在我们进入正题,讲AngularJS的指令。

什么是指令?

这里我们引用官方的一句话:
Custom directives to access the DOM: In AngularJS, the only place where an application should access the DOM is within directives. This is important because artifacts that access the DOM are hard to test. If you need to access the DOM directly you should write a custom directive for this. The directives guide explains how to do this.

翻译过来的,总结起来的意思就是应用程序能访问DOM的唯一通道就是指令。这就是这句话的意思,后面几句话是解释,就是说一方面这个东西难测试,另外你想这么做的话还可以自己写指令去直接访问DOM。

在我看来,AngularJS的指令相当于小型的组件,一方面你可以在指令里面直接操作DOM,另一方面指令模版可以使得代码控制的逻辑层面上可以结构分明,降低scope控制上的耦合度。比如一个简单的伸缩隐藏控制,一般会放到一个界面的作用域里面去统一控制,但是如果后续有其他同样的表单也有这样的处理,那就得每个模块各自写一套了,控制上也不保证能保持一致。相比之下,我们可以将这样类似的行为放到一个组件里面,由组件去自发的控制这个伸缩隐藏,反而可以避免很多不必要的事情。

指令属性

restrict

这个属性定义的是指令的使用方法,分别有4种,默认是EA

  • E 指定指令作为元素使用
  • A 指定指令作为属性使用
  • C 指定指令作为类名使用
  • M 指定指令作为注释使用

个人推荐的写法是,指令用A或者C,组件用E,这样区分起来会很清楚。
而指令用A还是用C取决于指令自身的使用范围,比如有的指令只是控制一些显示隐藏什么的,那A绰绰有余了,如果还有额外的全局样式控制,那还是C靠谱些,这样代码还工整些。

scope

这个属性定义的是指令的作用范围,分别有3种,默认是false

  • false 与父作用域共用一个作用域
  • true 继承父作用域,创建一个子作用域
  • {} 独立作用域,与父作用域无关联

个人的选择依据在于有木有复杂的表单交互控制,若有,则选择false可以减少一些交互上的问题,反之选true或者是独立作用域则是需要额外考量的,组件上则独立作用域会好一点,而子作用域的设立可以通过scope通信解决一些比较小的通信问题,同时也能保证作用域在一定程度上的独立性。

而独立作用域下有3种方式的通信

  • @ 属性侦测
  • & 事件继承
  • = 双向绑定(除了ngModel之外)

一般是双向绑定要好一些,特殊表单可以用双向绑定,但是数据输入这块还是需要transclue的支持,而且直接跟父作用域交互会更好。

template or templateUrl

这个属性很简单明了,一个是指令模版字符串形式,另一个是指令模版地址形式

replace

这个属性表明要不要做替换插入,false是作为子元素插入,反之是作为替换插入

transclue

这个可以类比vue的slot,内联插入标签内部的模版到ng-tranclude指令的标签内

controller

这个属性表明指令控制器可以创建scope,scope在link函数里面是共享的,作为link函数的第一参数,这里可以写一些需要绑定的事件,或者是数据处理

link

这个属性表示指令编译完成之后链接到DOM上的一些回调操作,pre表示链接之前,post表示链接之后,参数(作用域,模版元素,属性列表,ngModel控制器)

  • pre-link
  • post-link

这里可以做一些数据监控上的处理,比如属性监听,而且对DOM操作比较多的事件可以放到这里去做而不是在controller里面

compile

这个属性指的是自定义的编译方式,还有一个是参数绑定上的处理,比较危险,一般不建议操作的,参数(模版元素,属性列表)

AngularJS 指令解析(二)的更多相关文章

  1. AngularJS 指令解析(一)

    AngularJS 指令解析(一) 前言 笔者AngularJS接触时间差不多是两年多,虽然这两年多AngularJS版本日新月异,但是笔者的版本是比较老的1.4.3,一方面是自己对这个版本比较熟悉, ...

  2. angularjs指令(二)

    最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方.   Angularjs指令定义的API AngularJs的指令定义大致如下 angula ...

  3. AngularJS学习笔记二:AngularJS指令

    AngularJS 指令: AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. 几个常用 指令: ng-app 指令 ...

  4. angularJS 指令二

    指令详解1.用directive()方法来定义指令.directive('myDirective',function($timeout,userDefinedService){ return {};} ...

  5. AngularJS 指令实践指南(二)

    这个系列教程的第一部分给出了AngularJS指令的基本概述,在文章的最后我们介绍了如何隔离一个指令的scope.第二部分将承接上一篇继续介绍.首先,我们会看到在使用隔离scope的情况下,如何从指令 ...

  6. AngularJs指令(一)

    AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋.最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用 ...

  7. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  8. AngularJS 指令生命周期 complie link

    AnguarJS指令从解析到生效一共会经历Inject.Compile.Controller加载.Pre-link.Post-link这几个主要阶段. 一.AngularJS指令执行过程 1.加载An ...

  9. AngularJS指令

    1. AngularJS指令的特点: AngularJS通过被称为指令的新属性来扩展HTML,指令的前缀为ng-. AngularJS通过内置的指令来为应用添加功能. AngularJS允许你自定义指 ...

随机推荐

  1. loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对   题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...

  2. 《图解HTTP》阅读笔记-第五章-web服务器

      第五章.与HTTP协助的web服务器单台虚拟主机实现多个域名可以用单台物理主机运行多台虚拟主机,这些虚拟主机的IP相同,而虚拟主机有可以寄存多个不同主机名和域名的web网站,所以要保证发送HTTP ...

  3. 2019.2.14 考试T3 交互题

    \(\color{#0066ff}{ 题目描述 }\) 由于机房被成功拯救了,花_Q很高兴,花_Q生成了一个 0 到 N - 1 的排列(排列的下标从 0 到 N - 1 ).保证排列中 0 在 N ...

  4. loj#6229. 这是一道简单的数学题 (??反演+杜教筛)

    题目链接 题意:给定\(n\le 10^9\),求:\(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)} ...

  5. springboot整合mybatis,redis,代码(三)

    一 说明 接着上篇讲述redis缓存配置的用法: 二 正文 首先要使用缓存就必须要开开启缓存,第二步是需要开redis-server 下载redis包之后,点击图中两个都可以开启redis 怎么看是否 ...

  6. rent bike问题(二分+贪心)

    题目描述: A group of n schoolboys decided to ride bikes. As nobody of them has a bike, the boys need to ...

  7. FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    官网:http://ffmpeg.org 一.FFmpeg安装 安装依赖包: yum install libtheora-devel libvorbis-devel 1 FFmpeg编译安装: 由于系 ...

  8. hive复杂格式array,map,struct使用

    -- 创建数据库表,以array作为数据类型 drop table if exists person; create table person( name string ,work_locations ...

  9. mongodb在windows下安装

    下载地址:https://www.mongodb.com/download-center/community 我下载的是zip版本 新建目录:data |_db |_log cmd到所下载的mongo ...

  10. 配置sudo访问

    具体操作步骤 1.首先我们建立一个账户,设置密码 [root@VM_0_13_centos home]# useradd 123 [root@VM_0_13_centos home]# passwd ...