深入讲解AngularJS中的自定义指令的使用


Posted in Javascript onJune 18, 2015

AngularJS的自定义指令,就是你自己的指令,加上编译器编译DOM时运行的原生核心函数。这可能很难理解。现在,假设我们想在应用中不同页面复用一些特定的代码,而又不复制代码。那么,我们就可以简单地把这段代码放到单独的文件,并调用使用自定义指令的代码,而不是一遍又一遍地敲下来。这样的代码更容易理解。AngularJS中有四种类型的自定义指令:

  1.     元素指令
  2.     属性指令
  3.     CSS class 指令
  4.     注释指令

在我们现有的app中实现他们之前,我们来看看自定义指令是个什么样子:
 
元素指令

在html中写下如下的标签,它用来放置代码片段。当我们想使用特定的代码,我们就用上述标签来包含该代码。

<guitar-reviews> ... </guitar-reviews>

在JS文件中,用以下几行代码来使上述angularJS自定义指令生效。
 

app.directive('guitarReviews', function() {
 return {
  restrict  : 'E', // used E because of element 
  templateUrl : 'custom-directives/reviews.html'
 };
});

代码解释:

如同app.controller,我们先定义app.directive,然后定义guitarReview,后者是html中用到的元素标签名。但是你注意到没有,guitar-review 和guitarReviews是不同的?这是因为 guitar-reviews的连字符转换到驼峰式大小写,因而在JS文件中就变成了guitarReviews。下一步是正在返回参数的匿名函数。 restrict: ‘E' 是指我们在定义一个自定义元素指令,而 templateUrl则指向要包含的代码片段文件。
 
属性指令

在html文件的html标签中敲入如下属性,这个标签用来盛放代码片段。当我们想使用特定代码片段,我们只要敲下这样的标签来包含该代码。
 

<div guitar-reviews> ... </div>

在JS文件中,用以下代码来使上述angularJS自定义指令生效。
 

app.directive('guitarReviews', function() {
 return {
  restrict  : 'A', // used A because of attribute 
  templateUrl : 'custom-directives/reviews.html'
 };
});

注意: AngularJS 推荐你用简单的 css 和普通的注释代替自定义指令中的CSS和注释.

现在让我们在app中实现自定义指令吧。你可以在这里下载项目文件。我把reviews部分的代码放到单独的文件,再把该代码片段赋给一个元素,最后在details.html页面中使用.
 
第一步

在指定的文件夹下新建一个文件夹命名为cDirectives,用来存放自定义的指令。然后,在该文件夹下创建一个reviews.html文件,用于持有用户的reviews。此时,你的文件夹层次结构如下:

深入讲解AngularJS中的自定义指令的使用

 第二步

在details.html中剪切review部分,并添加<user-reviews></user-reviews>标签如下所示:

深入讲解AngularJS中的自定义指令的使用

 第三步

将你在details.html页面中剪切的代码拷贝至reviews.html如下所示:

<!-- Review Tab START, it has a new controller -->
<div ng-show="panel.isSelected(3)" class="reviewContainer" ng-controller="ReviewController as reviewCtrl" >
 
<!-- User Reviews on each guitar from data.json - simple iterating through guitars list -->
<div class="longDescription uReview" ng-repeat="review in guitarVariable[whichGuitar].reviews"> 
  <h3>Review Points: {{review.star}} </h3>
  <p> {{review.body}} ~{{review.name}} on <date>{{review.createdOn | date:'MM/yy'}} </p>
</div><!-- End User Reviews -->
 
<!-- This is showing new review preview-->
<div ng-show="add === 1" class="longDescription uReview" > 
  <h3>Review Points: {{reviewCtrl.review.star}} <span ng-click="add=0">X</span></h3>
  <p> {{reviewCtrl.review.body}} ~ {{reviewCtrl.review.name}} </p>
</div>
 
<!-- Add new Review to specific guitar - click this link to show review adding pannel -->
<a href ng-click="add=1" class="addReviewLink">Add review</a>  
 
<!-- form validates here using form name and .$valid and on submission we are going to addReview function with guitarID -->
<form class="reviewForm" name="reviewForm" ng-submit="reviewForm.$valid && reviewCtrl.addReview(guitarVariable.indexOf(guitarVariable[whichGuitar]))" novalidate ng-show="add===1" >
  <div>
    Review Points: 
    <!-- ng-option here is setting options, cool? -->
    <select ng-model="reviewCtrl.review.star" ng-options="point for point in [5,4,3,2,1]" required >    
    </select>
    Email: 
    <input type="email" ng-model="reviewCtrl.review.name" required>
    <button type="submit">Submit</button>
    </div>
    <textarea placeholder="Enter your experience with this guitar..." ng-model="reviewCtrl.review.body"></textarea>
</form><!-- END add new review -->
</div><br /><!-- END Review Tab -->

 
第四步

现在可以在user-reviews标签中添加行为了。让我们打开controller.js,添加如下代码:

GuitarControllers.directive('userReviews', function() {
 return {
  restrict  : 'E', // used E because of element 
  templateUrl : 'partials/cDirectives/reviews.html'
 };
});

 

代码解释:

我们的<user-reviews>指令在这里变成了userReviews(以camel形式表示)并且连字符不见了。下面我们可以说,当它被调用时加载templateURL中的文件并且对元素E限制该指令。

我们刚刚自定义了一个指令。尽管看起来我们的应用中没有变化,但是现在我们的代码较之前已经进行了很好的规划。你能为描述和规格自定义指令吗?自己尝试一下吧。

Javascript 相关文章推荐
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
Oct 17 Javascript
一个JavaScript操作元素定位元素的实例
Oct 29 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
Jan 25 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
Mar 01 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
Aug 31 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
jquery获取input输入框中的值
Nov 13 jQuery
JavaScript中的函数申明、函数表达式、箭头函数
Dec 06 Javascript
javascript实现评分功能
Jun 24 Javascript
vue 数据操作相关总结
Dec 17 Vue.js
3个可以改善用户体验的AngularJS指令介绍
Jun 18 #Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 #Javascript
使用AngularJS对路由进行安全性处理的方法
Jun 18 #Javascript
浅谈Node.js中的定时器
Jun 18 #Javascript
浅析AngularJS中的生命周期和延迟处理
Jun 18 #Javascript
Node.js事件驱动
Jun 18 #Javascript
详解AngularJS的通信机制
Jun 18 #Javascript
You might like
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
JavaScript 学习笔记(四)
2009/12/31 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
python fabric实现远程部署
2017/01/05 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
高中地理教学反思
2014/01/29 职场文书
法制报告会主持词
2014/04/02 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
文明生主要事迹
2014/05/25 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
个人违纪检讨书
2014/09/15 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
超强台风观后感
2015/06/09 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书