AngularJS 的自定义指令

简介:

这是一篇angularjs自定义指令的教程。就让我们来看看,如何在angularjs中自定义指令吧!我们将利用现有的guitar angularjs app,这在 教程14: AngularJ表单验证 中用到过。你可以在这里下载 之前的app.好吧,现在我们看看angularjs的指令。我们知道:

Angularjs Directives是DOM元素(例如属性,元素名,注释或CSS类)上的标记,它告诉AngularJS的 html 编译器($compile) 把特定的操作连接到DOM元素或转化为DOM元素及其子元素。例如, ng-app 属性是一个指令,因此 ng-controller 及所有的以ng-, ng:, ng_, x-ng-bind, data-ng-bind开头的属性都是。

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

  • 元素指令
  • 属性指令
  • CSS class 指令
  • 注释指令

在我们现有的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。此时,你的文件夹层次结构如下:
image

第二步

在details.html中剪切review部分,并添加标签如下所示:

image

第三步

将你在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'
  };
});

代码解释:

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

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

有趣的部分:

你可以通过css为你的user-reviews添加样式,就像你对于div层的处理一样。

下载项目文件。

希望你喜欢,并分享我的工作~

相关文章
|
存储 Oracle 关系型数据库
postgresql数据库|wal日志的开启以及如何管理
postgresql数据库|wal日志的开启以及如何管理
2349 0
|
Cloud Native Docker 容器
云原生之使用docker部署qbittorrent
云原生之使用docker部署qbittorrent
1032 2
云原生之使用docker部署qbittorrent
|
Java 开发者 Sentinel
网关修改响应码,拯救业务不规范设计
项目中的后端接口普遍使用200响应码,无论是否出错,导致OpenFeign和第三方应用处理困难。问题在于后端开发者对HTTP基础知识理解不足,未统一处理异常时的响应码。客户端依赖响应体的`code`字段而非HTTP状态码判断请求结果。为解决这个问题,网关可扮演关键角色:
269 0
|
域名解析 缓存 网络协议
DNS解析过程详解
【10月更文挑战第11天】 DNS(域名系统)解析过程是将域名转换为IP地址的关键步骤。客户端输入域名后,本地DNS服务器先检查缓存,如有记录则直接返回IP地址;否则依次向根DNS服务器、顶级域名服务器和权威DNS服务器查询,最终获取并缓存IP地址,返回给客户端,实现域名解析。这一过程确保了用户通过域名方便访问互联网资源。
1117 59
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
450 4
|
算法 安全 Linux
Ctfshow web入门 PHP特性篇 web89-web151 全(二)
Ctfshow web入门 PHP特性篇 web89-web151 全(二)
616 0
【qt】如何添加背景图片?
【qt】如何添加背景图片?
449 0
|
存储 Kubernetes 容灾
在k8S中,K8S持久化可以对接哪些储存,为什么要选择它?
在k8S中,K8S持久化可以对接哪些储存,为什么要选择它?

热门文章

最新文章