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

AngularJS四大核心特性—指令

在之前的内容中提到AngularJS的四个核心的特性是以下四点:

  • MVC
  • 模块化和依赖注入
  • 双向数据绑定
  • 指令

指令模块

在指令这个模块中主要讲述指令的使用以及原理,内容包括:

  • 解析最简单的指令hello:匹配模式restrict
  • 解析最简单的指令hello:template、templateUrl、$templateCache
  • 解析最简单的指令hello:replace与transclude
  • comile与link(操作元素、天剑CSS样式、绑定事件)
  • 指令与控制器之间的交互
  • 指令间的交互
  • scope的类型与独立scope
  • scope的绑定策略
  • AngularJS内置的指令
  • 实力解析Expander
  • 实例解析Accordion
  • 指令的运行原理:compile和link
  • 总结:ERP类型的系统必备的UI组件
  • 总结:互联网/电商型系统必备的UI组件
  • 第三方指令库angular-ui
  • directive思想的起源和原理概述

解析最简单的指令hello

我们首先来看一个实际的例子:

html

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <hello></hello>
        <div hello></div>
        <div class="hello"></div>
        <!-- directive:hello -->
        <div></div>
    </body>
    <script src="framework/angular-1.3.0.14/angular.js"></script>
    <script src="HelloAngular_Directive.js"></script>
</html>

js

var myModule = angular.module("MyModule", []);
myModule.directive("hello", function() {
    return {
        restrict: ‘AEMC‘,
        template: ‘<div>Hi everyone!</div>‘,
        replace: true
    }
});

效果

这是一个最简单的directive指令,其中有三个配置项:restrict,template,replace

这里使用了四种匹配的方式来实现hello这个指令,分别是AEMC,然后使用template中的语句,来replace掉了hello指令的部分。

template:‘<div>Hi everyone!</div>‘

1.解析最简单的指令hello:匹配模式restrict

一共有四种匹配的模式ACME

  • 推荐使用元素和属性的方式,也就是EA的方式来进行匹配。
  • M(注释模式)下注意前后要有一个空格,不然无法正确匹配
  • 当需要创建带有自己的模板的指令时,使用元素名称的方式创建
  • 当需要为已有的HTML标签增加功能时,使用属性的方式创建

2.解析最简单的指令hello:template、templateUrl、$templateCache

在上述的例子中,我们使用了template,当中是html的字符串,但是这样不太好,如果内容很多,字符串就会过长,而且可能在js中要涉及大量的拼接,效率也不高。

template:‘<div>Hi everyone!</div>‘

所以我们引入templateUrl来引入一个独立的html文件作为模板,这样更方便编写

templateUrl:‘hello.html‘

另外还有一个$templateCache

var myModule = angular.module("MyModule", []);

//注射器加载完所有模块时,此方法执行一次
myModule.run(function($templateCache){
    $templateCache.put("hello.html","<div>Hello everyone!!!!!!</div>");
});

myModule.directive("hello", function($templateCache) {
    return {
        restrict: ‘AECM‘,
        template: $templateCache.get("hello.html"),
        replace: true
    }
});

从cache字面意思上可以看出是要缓存,那么我们使用run这个方法,在加载完模块以后,先使用 $templateCache.put的方法将一段html的代码缓存到cache中。

当需要写template的时候,再使用 $templateCache.get的方法从换从中取出需要的代码就可以了。

3.解析最简单的指令hello:replace与transclude

  • replace设置为true,那么template中的html代码,会代替hello标签出现在html中,如果设置为false那么就不会代替hello标签,html中还是一个hello的标签存在
  • transclude是一个可以实现指令嵌套的选项。我们可以在hello标签中嵌套一个标签,下面来看一个小例子:

html

<!doctype html>
<html ng-app="MyModule">
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <hello>
            <div>这里是指令内部的内容。</div>
        </hello>
    </body>
    <script src="framework/angular-1.3.0.14/angular.js"></script>
    <script src="transclude.js"></script>
</html>

js

var myModule = angular.module("MyModule", []);
myModule.directive("hello", function() {
    return {
        restrict:"AE",
        transclude:true,
        template:"<div>Hello everyone!<div ng-transclude></div></div>"
    }
});

我们将transclude设置为true,然后在template中有这么一句:

<div ng-transclude></div>

这个将会确定原来嵌套在hello标签中的内容显示的地方。

所以最后显示的效果是

指令执行的机制–compile与link

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 23:09:31

AngularJS学习笔记(六)---指令的相关文章

angularjs学习笔记—事件指令

angularjs学习笔记—事件指令 小俞 4.4k 3月30日 发布 推荐 4 推荐 收藏 17 收藏,11.1k 浏览 ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click="click()">click me</div> <button ng-click="click()">click me<

-_-#AngularJS学习笔记

AngularJS学习笔记 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <style> .done{display:none} .ignore{color:#999} </style> <ul> <li class="

AngularJs学习笔记--directive

原版地址:http://code.angularjs.org/1.0.2/docs/guide/directive Directive是教HTML玩一些新把戏的途径.在DOM编译期间,directives匹配HTML并执行.这允许directive注册行为或者转换DOM结构. Angular自带一组内置的directive,对于建立Web App有很大帮助.继续扩展的话,可以在HTML定义领域特定语言(domain specific language ,DSL). 一.在HTML中引用direc

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

angularjs 学习笔记(一) -----JSONP跨站访问

1.  下载angular-seed-master-master包,解压缩后将新版本的angularJS文件放入其中. 2.  制作frontmockup文件夹(前端调用),同时制作backmockup文件夹(后端调用),使用IIS开启2个webserver(此步骤可以用其他方式替代). 3.  backmockup站点添加以下HTTP头 Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:origin,x-req

angularjs 学习笔记 -----结构定义

1.  Module使用方法 var APP =angular.module('fontApp',['ngResource', 'ngRoute', 'ngSanitize']); APP为定义的别名,之后的调用都应尽量使用该别名 'fontApp' ng-app="fontApp" 新版本angular中route被分离出来,各个被使用的Providerdou需要在此处声明. 大型应用应该拆分模块来做,先定义一个服务模块,然后再加载它 angular.module('xmpl.ser