`
wangsuting
  • 浏览: 29766 次
社区版块
存档分类
最新评论

转载>>AngularJS 指令Directives实践指南(一)

 
阅读更多

指令(Directives)是所有AngularJS应用最重要的部分。尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令。这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用。在这篇文章的最后(第二部分),我会指导你如何使用Angular指令来创建一个简单的记事本应用。

概述

创建自定义指令:

一个Angular指令可以有以下的四种表现形式: 1. 一个新的HTML元素(<data-picker></data-picker>) 2. 元素的属性(<input type=”text” data-picker/>) 3. CSS class(<input type=”text” class=”data-picker”/>) 4. 注释(<!–directive:data-picker –>) 当然,我们可以控制我们的指令在HTML中的表现形式。下面我们来看一下AngularJS中的一个典型的指令的写法。指令注册的方式与 controller 一样,但是它返回的是一个拥有指令配置属性的简单对象(指令定义对象) 。下面的代码是一个简单的 Hello World 指令。

var app = angular.module('myapp', []);
 
app.directive('helloWorld', function() {
  return {
      restrict: 'AE',
      replace: 'true',
      template: '<h3>Hello World!!</h3>'
  };
});

在上面的代码中,app.directive()方法在模块中注册了一个新的指令。这个方法的第一个参数是这个指令的名字。第二个参数是一个返回指令定义对象的函数。如果你的指令依赖于其他的对象或者服务,比如 $rootScope, $http, 或者$compile,他们可以在这个时间被注入。这个指令在HTML中以一个元素使用,如下:

<hello-world/>
//OR
<hello:world/>

或者,以一个属性的方式使用

<div hello-world></div>
//OR
<div hello:world/>

如果你想要符合HTML5的规范,你可以在元素前面添加 x- 或者 data-的前缀。所以下面的标记也会匹配 helloWorld 指令:

<div data-hello-world></div>
//OR
<div x-hello-world></div>

注意: 在匹配指令的时候,Angular会在元素或者属性的名字中剔除 x- 或者 data- 前缀。 然后将 – 或者 : 连接的字符串转换成驼峰(camelCase)表现形式,然后再与注册过的指令进行匹配。这是为什么,我们在HTML中以 hello-world 的方式使用 helloWorld 指令。其实,这跟HTML对标签和属性不区分大小写有关。 尽管上面的指令仅仅实现了静态文字的显示,但是这里还是有一些有趣的点值得我们去挖掘。我们在指令定义过程中使用了三个属性来配置指令。我们来一一介绍他们的作用。

  • restrict – 这个属性用来指定指令在HTML中如何使用(还记得之前说的,指令的四种表示方式吗)。在上面的例子中,我们使用了 ‘AE’。所以这个指令可以被当作新的HTML元素或者属性来使用。如果要允许指令被当作class来使用,我们将 restrict 设置成 ‘AEC’。

  • template – 这个属性规定了指令被Angular编译和链接(link)后生成的HTML标记。这个属性值不一定要是简单的字符串。template 可以非常复杂,而且经常包含其他的指令,以及表达式({{ }})等。更多的情况下你可能会见到 templateUrl, 而不是 template。所以,理想情况下,你应该将模板放到一个特定的HTML文件中,然后将 templateUrl 属性指向它。

  • replace – 这个属性指明生成的HTML内容是否会替换掉定义此指令的HTML元素。在我们的例子中,我们用 <hello-world></hello-world>的方式使用我们的指令,并且将 replace 设置成 true。所以,在指令被编译之后,生成的模板内容替换掉了 <hello-world></hello-world>。最终的输出是 <h3>Hello World!!</h3>。如果你将 replace 设置成 false,也就是默认值,那么生成的模板会被插入到定义指令的元素中。

打开这个 plunker,在”Hello World!!”右键检查元素内容,来更形象地明白这些。

Link函数和Scope

指令生成出的模板其实没有太多意义,除非它在特定的scope下编译。默认情况下,指令并不会创建新的子scope。更多的,它使用父scope。也就是说,如果指令存在于一个controller下,它就会使用这个controller的scope。 如何运用scope,我们要用到一个叫做 link 的函数。它由指令定义对象中的link属性配置。让我们来改变一下我们的 helloWorld 指令,当用户在一个输入框中输入一种颜色的名称时,Hello World 文字的背景色自动发生变化。同时,当用户在 Hello World 文字上点击时,背景色变回白色。 相应的HTML标记如下:

<body ng-controller="MainCtrl">
  <input type="text" ng-model="color" placeholder="Enter a color" />
  <hello-world/>
</body>

修改后的 helloWorld 指令如下:

app.directive('helloWorld', function() {
  return {
    restrict: 'AE',
    replace: true,
    template: '<p style="background-color:{{color}}">Hello World',
    link: function(scope, elem, attrs) {
      elem.bind('click', function() {
        elem.css('background-color', 'white');
        scope.$apply(function() {
          scope.color = "white";
        });
      });
      elem.bind('mouseover', function() {
        elem.css('cursor', 'pointer');
      });
    }
  };
});

我们注意到指令定义中的 link 函数。 它有三个参数:

  • scope – 指令的scope。在我们的例子中,指令的scope就是父controller的scope。

  • elem – 指令的jQLite(jQuery的子集)包装DOM元素。如果你在引入AngularJS之前引入了jQuery,那么这个元素就是jQuery元素,而不是jQLite元素。由于这个元素已经被jQuery/jQLite包装了,所以我们就在进行DOM操作的时候就不需要再使用 $()来进行包装。

  • attr – 一个包含了指令所在元素的属性的标准化的参数对象。举个例子,你给一个HTML元素添加了一些属性:,那么可以在 link 函数中通过 attrs.someAttribute 来使用它。

link函数主要用来为DOM元素添加事件监听、监视模型属性变化、以及更新DOM。在上面的指令代码片段中,我们添加了两个事件, click,和 mouseover。click 处理函数用来重置 <p> 的背景色,而 mouseover 处理函数改变鼠标为 pointer。在模板中有一个表达式 {{color}},当父scope中的 color 发生变化时,它用来改变 Hello World 文字的背景色。 这个 plunker 演示了这些概念。

 原文链接: sitepoint   翻译: 伯乐在线 陈 鑫伟

译文链接: http://blog.jobbole.com/62249/
分享到:
评论

相关推荐

    AngularJS Directives Cookbook

    #### 一、AngularJS指令简介 AngularJS 是一个流行的 JavaScript 框架,用于构建动态的 Web 应用程序。AngularJS 指令是框架的一个核心功能,它允许开发者通过扩展 HTML 的语法来创建自定义的行为和组件。本书...

    angularjs-style-guide-github

    本知识点将详细介绍一个在GitHub上广泛流传的AngularJS风格指南——mgechev/angularjs-style-guide的内容。 ### 标题解读: “angularjs-style-guide-github”指的是这个风格指南的来源,即位于GitHub上的AngularJS...

    angularjs前端框架

    ### AngularJS前端框架知识点详解 #### 一、AngularJS简介 AngularJS是一个开源的JavaScript框架,由Google维护和支持。...AngularJS的核心特性包括数据...继续深入探索和实践,你会逐渐成为一名优秀的AngularJS开发者。

    使用AngularJS编写较为优美的JavaScript代码指南

    **AngularJS 编写优美JavaScript代码指南** 在前端开发领域,AngularJS 是一款非常流行的JavaScript框架,它提供了丰富的功能和工具来构建复杂的应用程序。本文将聚焦于如何使用AngularJS编写更加优雅、易于维护的...

    学习AngularJS _ RIA爱好者1

    【AngularJS 学习指南】 AngularJS 是一个强大的前端JavaScript框架,由Google维护,用于构建富互联网应用程序(RIA)。它采用MVC(Model-View-Controller)架构模式,简化了前端开发,使得开发者能够更高效地创建...

    AngularJS UI Development 随书代码

    《AngularJS UI Development》这本书是关于使用AngularJS框架进行用户界面开发的专业指南,随书附带的代码资源库名为"AngularUI-Code-master"。这个压缩包中的代码旨在帮助读者深入理解并实践AngularJS在构建现代Web...

    前端项目-angular-google-chart.zip

    AngularJS指令是扩展HTML的一种方式,可以定义新的行为或增强现有元素。这里的模块专门设计用来方便地在AngularJS应用中使用Google图表。 **标签解析** "前端项目"标签指示这是一个关于Web前端开发的工作,重点...

    blackjack-in-angularjs:AngularJs 中的一个简单实验

    【标题】"blackjack-in-angularjs:AngularJs 中的一个简单实验"揭示了这个项目的核心——在AngularJS框架中实现一个Blackjack(21点)游戏。AngularJS是Google推出的一款强大的前端开发框架,用于构建单页应用(SPA...

    AngularJS可重用HTML编辑器控件

    在实际项目中,为了实现控件的重用,我们可以创建一个AngularJS模块,包含一个编辑器指令。这个指令可以接受配置参数,如是否开启预览模式,或者自定义工具栏按钮。然后,在需要使用编辑器的任何地方,只需导入这个...

    Angular JS权威教程

    - **指令(Directive)**: 是AngularJS中的一个特殊属性,用于扩展HTML的功能。指令可以改变DOM结构、绑定事件监听器等。 - **路由(Routing)**: 用于管理单页面应用中的不同视图。通过定义路由规则,可以根据URL的变化...

    angular代码规范.pdf

    - **代码风格**:遵循AngularJS官方的编码风格指南,如使用`$scope`的最佳实践,避免全局变量等。 - **文档注释**:为每个组件添加清晰的文档注释,方便其他开发者理解和使用。 5. **持续集成和自动化工具**: ...

    前端项目-angular-ui.zip

    总的来说,这个“前端项目-angular-ui.zip”提供了一个使用AngularJS和Angular UI构建的前端项目实例,对于学习和实践AngularJS的UI开发具有参考价值。通过研究这个项目,开发者可以深入了解AngularJS的架构和组件化...

    api.github.philos.io:用于github应用程序的API

    5. `directives.js` - 指令文件,定义了自定义的AngularJS指令,用于增强HTML元素的功能。 6. `styles.css/less/sass` - 样式文件,负责应用的视觉样式。 7. `templates` 文件夹 - 可能包含了一些预渲染的HTML模板,...

    用Typescript烹饪angular.js

    总之,“用Typescript烹饪angular.js”是一个关于如何在保持项目运行的同时,逐步提升代码质量和可维护性的实践指南。它帮助开发者理解如何在现有AngularJS项目中引入强类型和现代化的开发实践,为项目的长远发展...

    Angular2 环境配置详细介绍

    - `ng generate directive my-directive`:生成新的指令。 - `ng generate pipe my-pipe`:生成新的管道。 - `ng generate service my-service`:生成新的服务。 - `ng generate route my-route`:生成新的路由。 - ...

Global site tag (gtag.js) - Google Analytics