Angular开发者手册重点翻译之指令(一)

创建自定义的指令

这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它。

什么是指令

在高的层面上讲,指令是DOM元素中的标记(例如一个属性,一个节点名,注释或者CSS类),它告诉angularjs编译器去给这个元素附加一个指令的行为或者转换DOM元素和它的子元素。

Angularjs拥有一些内建的指令,像ngBind、ngModel和ngClass。非常类似于你创建自己的controller和service,你可以创建你自己的指令个angularjs使用,党angular初始化启动你的应用程序,html编译器将遍历你的DOM元素并且去匹配指令。

匹配指令

在你可以编写指令之前,你需要知道当你使用一个给定的指令的时候,angularjs的html编译器是怎样工作的.

在下面的例子里,我们说<input>元素匹配了ngModel指令:

<input&nbsp;ng-model="foo">
下面的例子也同样匹配ngModel指令:
<input&nbsp;data-ng:model="foo">

Angular规范是一个元素标签和属性名去决定哪个元素匹配哪个指令,我们通常使用大小写敏感的驼峰式规范化命名应用指令。可是因为HTML是大小写不敏感的,所以我们在DOM中使用小写的方式去引用指令,通常在DOM元素上使用短划线分隔的属性。

规范化的形式如下所示:

1:去除元素或者属性以x-和data-的开头。

2:使用:/_/-分隔驼峰式的命名。

例如,以下的格式都是等价的并且匹配ngBind指令:

<div&nbsp;ng-controller="Controller">
  Hello <input&nbsp;ng-model='name'> <hr/>
  <span&nbsp;ng-bind="name"></span> <br/>
  <span&nbsp;ng:bind="name"></span> <br/>
  <span&nbsp;ng_bind="name"></span> <br/>
  <span&nbsp;data-ng-bind="name"></span> <br/>
  <span&nbsp;x-ng-bind="name"></span> <br/>
</div>

最佳实践:推荐使用短划线间隔的格式(比如ngBind指令使用ng-bind),假如你想使用一个HTML验证工具,你可以换为使用data-前缀的样式(比如ngBind指令使用data-ng-bind)。其他的样式,在一些遗留的因素上也是可接受的,但是我们建议你避免使用它们

所有Angular提供的指令匹配属性名、标签名、注释或者类名,下面演示了一个指令可以被引用的几种方式:

<my-dir></my-dir>
<span&nbsp;my-dir="exp"></span>
<!-- directive: my-dir exp -->
<span&nbsp;class="my-dir: exp;"></span>

最佳实践:对比注释和类型,我们更多的倾向于使用标签名和属性,这样可以更容易地确定哪个指令是元素需要去匹配的。

最佳实践:注释形的指令通常用于DOM API不可以跨越多个元素去创建指令的限制(比如在table元素内部),AngularJS 1.2加入了ng-repeat-start和ng-repeat-end作为这个问题的一个更好的解决方案,开发人员被鼓励使用这种方式来替换注释形的指令。

文本和属性绑定

在编译工作阶段,编译器使用$interpolate服务匹配文本和属性,它将发现他们是否包含嵌入的表达式。这些表达式将被注册为watchs,并且作为一个通常的生命周期的一部分被更新,下面是一个interpolation的示例:

<a&nbsp;ng-href="img/{{username}}.jpg">Hello {{username}}!</a>

ngAttr属性绑定

浏览器对属性是否合法经常是挑刺的,例如,考虑一下这个例子:

<svg>
  <circle&nbsp;cx="{{cx}}"></circle>
</svg>

我们期望Angular可以去绑定它,但是当我们查看控制台,我们将会看到一些这样的信息

Error: Invalid value for attribute cx="{{cx}}"

因为SVG DOM API是严谨话的,你不可以简单的写cx="{{cx}}"这样的属性。但是你可以使用ng-attr-cx来绕过这个问题,加入有一个拥有绑定的属性是拥有ngAttr前缀的,在绑定阶段,它将会被应用到相应的无前缀的属性上,这样就允许你去绑定你想要的属性,否则你只能看着它被浏览器处理掉,当使用ngAttr的时候,$interpolate的allOrNothing标识被使用,所以假如任何表达式返回的是undefined,这个属性将会被移除而不是添加到元素上。例如,我们可以像这样修复上文中的问题

<svg>
  <circle&nbsp;ng-attr-cx="{{cx}}"></circle>
</svg>

假如想要去使用一个驼峰式属性名,像viewBox,可以使用下划线去指示属性去绑定到一个实际的驼峰属性上。例如下文中绑定一个viewBox,我们可以这样写:

<svg&nbsp;ng-attr-view_box="{{viewBox}}">
</svg>

创建指令

首先让我们谈谈注册指令的API,与controller相似,指令是注册在module上的,想要注册它,你可以使用module.directive   API,module.directive需要一个规范化的指令名跟随着一个工厂方法,这个工厂方法需要返回一个包含不同选项来告诉$compile指令在被匹配的时候应该怎样去表现的对象。

这个工厂方法只会被在编译器匹配到指令的第一次的时候调用一次,你可以在这个时机执行任何的初始化工作,这个方法需要被$compile.invoke调用使得它可以像controller一样是可注入的。

最佳实践:推荐使用定义对象而不是返回一个方法。

我们将会使用一些指令的通常示例,然后进行深入的探讨不同的选项和编译过程。

最佳实践:为了避免与将来的标准冲突,最好为你自己的指令加一个前缀,比如,加入你想创建一个carousel指令,如果HTML7包含了一个这样的元素,这就会有问题了,两个或者三个字母的前缀就会使它工作的很好,同样的,不要给自己的指令加上ng或者可能会和未来版本的angular引起冲突的前缀。

Angular指令(一)的更多相关文章

  1. angular指令深度学习篇

    angular指令深度学习-过滤器 limitTo ... <body ng-app="app" > <div ng-controller="myCtr ...

  2. Angular指令渗透式理解

    通过一段时间对angular指令的使用,理解了angular指令的意义,下面逐一介绍一下. ng-app:定义一个angualr模块,表示angular作用的范围,如下代码: ng-app在html标 ...

  3. Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证

    最近这段时间发现,北京这用angular4 或 angular2的公司很少.几乎是没有.很担心自己是不是把精力放到了不应该的地方.白耽误了时间.但是随着我对新版angular框架理解的加深.个人感觉a ...

  4. angular指令之complie和link不得不说的故事

    angular指令比较晦涩难懂的就是complie和link字段了,什么时候该用complie?什么时候该用link?总是很难分别清楚.当理解了指令的真正编译原理的时候,就会发现这相当的简单. ng怎 ...

  5. 【转】angular指令入坑

    独立作用域和函数参数 通过使用本地作用域属性,你可以传递一个外部的函数参数(如定义在控制器$scope中的函数)到指令.这些使用&就可以完成.下面是一个例子,定义一个叫做add的本地作用域属性 ...

  6. angular 指令作用域 scope

    转载自:https://segmentfault.com/a/1190000002773689 下面我们就来详细分析一下指令的作用域. 在这之前希望你对AngularJS的Directive有一定的了 ...

  7. Angular指令1

    Angular的指令 也就是directive,其实就是一WebComponent,以前端的眼光来看,好象很复杂,但是以后端的眼光来看,还是非常简单的.其实就是一个中等水平的类. var myModu ...

  8. angular指令大全

    这篇文章的案例都是来自官方,引用的cdn来自bootcss, 因为angular的官方网站被屏了, 所以要翻, 不过我把整个文档下回来了,方便大家下载可以点击: 打开下载英文版 angular的指令 ...

  9. 初学angular-简单的angular指令

    实现一个简单的input清空内容,且清空对应ngModel 前台部分 <html ng-app="hpapp"> <head> <meta chars ...

  10. 学习angular 指令构造器时遇到的小问题

    在学习angular时,使用模块来为应用添加自己的指令时,遇到了一个问题,演示的代码如下: <!DOCTYPE html> <html> <head> <me ...

随机推荐

  1. UFLDL接听教程练习(来自编码器和矢量编程疏)

    最近想在深入学习研究,开始看UFLDL(unsuprisedfeature learning and deep learning)教程了.特将课后习题答案放在这里,作为一个笔记. 笔记: 1:自编码算 ...

  2. NSIS:在线下载并安装程序

    原文 NSIS:在线下载并安装程序 看到有同学留言说需要这方面的代码,所以贴出以下代码供参考(非完整脚本).需要用NSISdl插件. Section -.NET Framework    NSISdl ...

  3. zoj-3792-Romantic Value-最小割+数值转化

    假设不须要求边的个数的话,就是一个裸的最小割问题. 求边的个数就用边的权值记录一下. #include <stdio.h> #include <iostream> #inclu ...

  4. Android清除缓存功能来实现

    我们都知道在Android的设置->应用程序中能够查看应用程序的相关信息,当中有一个功能是清除缓存. 如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...

  5. Windows下一个MySQL有些错误的解决方法

    1.无论是什么提示.我们有一个直接看错误日志.由于它描述了最具体描述错误日志. 于MySQL安装文件夹中找到 my.ini简介 看日志保存路径 2. 我的错误是[ERROR] Fatal error: ...

  6. matlab练习程序(PCA<SVD>)

    clear all;close all;clc;img1=imread('Corner.png');img2=imread('Corner1.png');img3=imread('Corner2.pn ...

  7. 随笔 - Internet缓存文件

    Internet缓存文件 本文地址: http://blog.csdn.net/caroline_wendy 互联网上全部的使用记录, 图片, 音乐, 视频, 都会缓存在本地. 1. 位置: IE-& ...

  8. ASP.NET MVC应用程序展示RDLC报表

    原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...

  9. 编程算法基础-数字数码管-隐藏password

    作业 数字数码管 个数码管) @@@@         0     @          @       1   2     @          @         3        @@@@    ...

  10. 平原绫香 Hirahara Ayaka-Jupiter

    我第一次听到平原绫香(Hirahara Ayaka)久石让在武道馆演唱会.她的歌声真的很震惊! 声音是如此的纯净,演唱会是如此的优雅.她着迷,只是如此美丽. 然后我去检查她的信息.发现Jupiter. ...