AngularJS(1)——AngularJS指令机制

About

关于angularjs的指令学习,小编看了imooc的视频然后翻墙到外面看文章(边看边Google翻译,好好学英语吧骚年们),然后回来写一个总结,写我看到的,写我听到的。

刚刚开始接触angular的时候,只觉得几句话就可以搞定一件事情,代替了之前一堆的AJAX的异步加载。AngularJS is perfect for Single Page Applications (SPAs).这个单页应用程序是什么,通常的说法是它通过避免页面刷新大大提高了网站的响应性,就像桌面应用,如果单页程序放到移动端就像是原生app一样的用户体验。

最开始第一代web是干啥都要去找服务器调资源,从服务器拼接好html通过response来返回静态页面。现在看来,都讲究把经常加载的数据置前,在效率和空间总要选一样的。后来呢,AJAX来了,大家都学会了异步加载,还记得是个XMLHttpRequest  对象,就可以取部分数据异步更新。之后,AngularJS仅需HTML,CSS和JavaScript就可在客户端创建单页面应用。它的目标是是开发和测试更容易,增强MVC
Web应用的性能。前端的料真的原来越来越腻害了呢。

AngularJS Directives

那么指令是什么东东呢,简单说,就是扩展html的一个新的属性。我们可以用定义好的指令完成我们的业务,也可以自定义的封装指令。指令就是一个简单的替换标签的过程,变换成html看得懂的内容。指令都带有一个ng-的前缀。先来个例子给你一个体会。

ng-app:标志着angularjs初始化

ng-init:应用程序数据初始化

ng-model:用来执行数据绑定到元素上面

<!DOCTYPE html>
<html>

<body>

<div ng-app="" ng-init="learn='Angular'">

<p>Input something you want to learn:<input type="text" ng-model="learn"></p>
<p>You wrote: {{ learn}}</p>

</div>

</body>
   <script src="js/angular-1.3.0.js"></script>
</html>

下面已ng-model为例让大家了解一下指令可以做什么。

Two-Way Binding

在上面的例子中我用到了ng-app,ng-init,ng-model 这样实现了一个简单的angular小呆萌。其中有一个强大的取值表达式:{{}},通过ng-model="learn" 实现了数据的双向绑定。在修改input的值的同时, AngularJS 属性的值(learn)也将修改。

Validate User Input

还是这个ng-model指令,它可以对angular程序进行数据验证(number,e-mail,required)

<!DOCTYPE html>
<html>

<body>

<form ng-app="" name="myForm">
    Email:
    <input type="email" name="myAddress" ng-model="text">
    <span ng-show="myForm.myAddress.$error.email" >Not a valid e-mail address</span>
</form>

</body>
  <script src="js/angular-1.3.0.js"></script>
</html>

Application Status

ng-model 指令可以为应用数据提供状态值(invalid, dirty, touched, error)

<!DOCTYPE html>
<html>

<body>

<form ng-app="" name="myForm" ng-init="myText = '[email protected]'">

Email:
<input type="email" name="myAddress" ng-model="myText" required>
<p>Edit the e-mail address, and try to change the status.</p>
<h1>Status</h1>
<p>Valid: {{myForm.myAddress.$valid}} (if true, the value meets all criteria).</p>
<p>Dirty: {{myForm.myAddress.$dirty}} (if true, the value has been changed).</p>
<p>Touched: {{myForm.myAddress.$touched}} (if true, the field has been in focus).</p>

</form>

</body>
  <script src="js/angular-1.3.0.js"></script>
</html>

vaild:验证值是否满足标准

dirty:验证值是否发生变化

touched:验证是否获取焦点

CSS Classes

这个就很好理解了,可以根据上面的状态来设置css样式,标识着发生变化。

<!DOCTYPE html>
<html>

<style>
input.ng-invalid {
    background-color: lightblue;
}
</style>
<body>

<form ng-app="" name="myForm">
    Enter your name:
    <input name="myName" ng-model="myText" required>
</form>

<p>Edit the text field and it will get/lose classes according to the status.</p>
<p><b>Note:</b> A text field with the "required" attribute is not valid when it is empty.</p>

</body>
  <script src="js/angular-1.3.0.js"></script>
</html>

Create New Directives

看了这么多的小例子,自己写一个怎么样。写之前,你要知道指令声明的几种方式:

restrict 意义
E Element name
A Attribute
C Class
M Comment

想着我说过的,替换,这样实现一个简单的html的嵌套,相当于在主视图声明一个变量,在js文件里面替换掉主视图的声明。

<!DOCTYPE html>
<html ng-app="MyModule">
<head>
    <meta charset="utf-8">
</head>
<body>
    <hello></hello>
    <div hello></div>
    <div class="hello"></div>
</body>
    <script src="js/angular-1.3.0.js"></script>
    <script src="HelloAngular_Directive.js"></script>
</html>

JS文件:
var MyModule=angular.module("MyModule",[]);
MyModule.directive("hello", function () {
	return {
		restrict: 'ACME',
		template: '<div>Hi everyone!</div>',
		replace: true
	}
});

Expand

给大家看一个综合的例子,里面用到了自定义指令,link函数主要用来为DOM元素添加事件监听、监视模型属性变化、以及更新DOM。还有ng-repeat来循环显示一个数组。

js文件:

var expModule=angular.module('expanderModule',[])
expModule.directive('accordion', function() {
    return {
        restrict : 'EA',
        replace : true,
        transclude : true,
        template : '<div ng-transclude></div>',
        controller : function() {
            var expanders = [];
            this.gotOpened = function(selectedExpander) {
                angular.forEach(expanders, function(expander) {
                    if (selectedExpander != expander) {
                        expander.showMe = false;
                    }
                });
            }
            this.addExpander = function(expander) {
                expanders.push(expander);
            }
        }
    }
});

expModule.directive('expander', function() {
    return {
        restrict : 'EA',
        replace : true,
        transclude : true,
        require : '^?accordion',
        scope : {
            title : '=expanderTitle'
        },
        template : '<div>'
                   + '<div class="title" ng-click="toggle()">{{title}}</div>'
                   + '<div class="body" ng-show="showMe" ng-transclude></div>'
                   + '</div>',
        link : function(scope, element, attrs, accordionController) {
            scope.showMe = false;
            accordionController.addExpander(scope);
            scope.toggle = function toggle() {
                scope.showMe = !scope.showMe;
                accordionController.gotOpened(scope);
            }
        }
    }
});

expModule.controller("SomeController",function($scope) {
    $scope.expanders = [{
        title : 'Click me to expand',
        text : 'Hi there folks, I am the content that was hidden but is now shown.'
    }, {
        title : 'Click this',
        text : 'I am even better text than you have seen previously'
    }, {
        title : 'Test',
        text : 'test'
    },{
        title:'hello world',
        text:'this is create by me'
    }];
});

html文件:
<html ng-app="expanderModule">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <script src="js/angular-1.3.0.js"></script>
        <link rel="stylesheet" type="text/css" href="Accordion.css"/>
    </head>
    <body ng-controller='SomeController' >
        <accordion>
            <expander class='expander' ng-repeat='expander in expanders' expander-title='expander.title'>
                {{expander.text}}
            </expander>
        </accordion>
    </body>
    <script src="Accordion.js"></script>
</html>

总结

1.指令是所有AngularJS应用最重要的部分,内置指令有63个。多多敲几个例子,你就会了解指令的概念了。

2.推荐大家去看看几个网站了解一下angularjs

http://www.w3schools.com/angular/default.asp

http://www.apjs.net/

时间: 2024-11-13 16:21:52

AngularJS(1)——AngularJS指令机制的相关文章

AngularJS 学习笔记 -- 指令(Directive)

AngularJS 指令学习笔记 AngularJS怎样处理指令其实是依赖于指令定义时返回的对象属性的,所以要想深入理解如何定义一个指令,首相需要理解指令定义时各个参数的含义. 完整的AngularJS指令参数 angular.module('app', []) .directive('demoDirective', function (){ // 依据官方规范,指令的定义时应该严格遵循驼峰式命名规则,使用时采用'-'连接单词 return { restrict : String in ['E'

走进AngularJs(五)自定义指令----(下)

自定义指令学习有段时间了,学了些纸上谈兵的东西,还没有真正的写个指令出来呢...所以,随着学习的接近尾声,本篇除了介绍剩余的几个参数外,还将动手结合使用各参数,写个真正能用的指令出来玩玩. 我们在自定义指令(上)中,写了一个简单的<say-hello></say-hello>,能够跟美女打招呼.但是看看人家ng内置的指令,都是这么用的:ng-model="m",ng-repeat="a in array",不单单是作为属性,还可以赋值给它,与

AngularJS 作用域与数据绑定机制

AngularJS 简介 AngularJS 是由 Google 发起的一款开源的前端 MVC 脚本框架,既适合做普通 WEB 应用也可以做 SPA(单页面应用,所有的用户操作都在一个页面中完成).与同为 MVC 框架的 Dojo 的定位不同,AngularJS 在功能上更加轻量,而相比于 jQuery,AngularJS 又帮您省去了许多机械的绑定工作.在一些对开发速度要求高,功能模块不需要太丰富的非企业级 WEB 应用上,AngularJS 是一个非常好的选择.AngularJS 最为复杂同

[转]你知道用AngularJs怎么定义指令吗?--很详细

前言 最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方. Angularjs指令定义的API AngularJs的指令定义大致如下 angular.module("app",[]).directive("directiveName",function(){ return{ //通过设置项来定义 }; }) 其中return返回的对象包含很多参数,下面一一说明 1.restrict (字符串)可选参数,指明指令

带你走近AngularJS - 创建自定义指令

为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义指令的功能,并且AngularJS 是目前唯一提供Web应用可复用能力的框架. 目前有很多JavaScript 产品提供插件给Web开发人员.例如, Bootstrap 就是当前比较流行的提供样式和JavaScript插件的前端开发工具包.但是开发人员在使用Booostrap中的插件时, 必须切换到JavaScript 模式来写 jQuery

AngularJS创建新指令

指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令. AngularJS原有的指令 ng-init   初始化指令 ng-if   条件指定 ng-repeat   循环指令 下面为大家介绍下创建新指令的方法 加入html代码 <div ng-app="myapp"> <hello-world></hello-world> <div hello-

angularJS之常用指令

angular版本号1.4.3 内置指令 所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突. ng-app ng-app指令启动一个AngularJS应用. 声明Angular的边界. 它定义根元素. 它会自动初始化或启动加载包含AngularJS应用程序的Web页面的应用程序. 它也被用来加载各种AngularJS模块AngularJS应用. 例:使用html元素的ng-app 属性启动一个默认AngularJS应用与名为myApp的自定义AngularJS应用. <html

关于angularjs的ng-repeat指令

(如果有说的不对,欢迎指教,更欢迎大家一起交流.) 关于angularjs的ng-repeat指令,想必每个学习angularjs的初学者都很有映像.那我也总结一下我使用ng-repeat的时候经验,ng-repeat他只能循环出数组和对象,所以当在项目中,如果碰到ng-repeat循环不出数据的时候,不妨查看一下数据源是否为数组等 . 其次说一下循环内嵌,循环内嵌就是ng-repeat某个json数组某个数据时候,还需要循环其子数据 例如json格式如下: 我们需要循环出name和city里面

AngularJs——简介,表达式,指令

AngularJs简介 AngularJs是一个JavaScript框架,它可通过<script>标签添加到HTML页面,它是一个以JavaScript编写的库. AngularJs通过指令扩展了HTML,且通过表达式绑定数据到HTML. AngularJs扩展了HTML AngularJs通过ng-directives扩展了HTML. ng-app指令定义一个AngularJs应用程序. ng-model指令把元素值(比如输入域的值)绑定到应用程序. ng-bind指令把应用程序数据绑定到H