AngularJS Directive 学习笔记
指令 Directive
指令要点
大漠老师的教学节点
- 解析最简单的指令 hello: 匹配模式 restrict
- 解析最简单的指令 hello: template、tempmlateUrl、$templateCache
- 解析最简单的指令 hello: replace 与 transclude
- compile 与 link (操作元素、添加 CSS 样式、绑定事件)
- 指令与控制器之间的交互
- 指令间的交互
- scope 的类型与独立 scope
- scope 的绑定策略
简单的指令
app.directive('hello', function() {
return {
// 四种: Element, Attribute, Comment, Class
// Default: Attribute
// Comment: <!-- directive:hello -->
restrict: "E/A/M/C",
// 模板
template: '<h1>Hi everyone! </h1>',
templateUrl: 'temp.html',
// 是否替换节点内的内容
replace: true
}
});
transculde 转置
transclude 作用在于转置指令内部原有的内容,以免 replace: true
被设置时内部内容被全部替换,这样非常有用于嵌套指令
app.directive('ele', function() {
return {
// 注意:不能用 replace: true
restrict: 'AE',
transclude: true,
// 标签内部内容将会被转置到 div[ng-transclude] 内部
template: "<h1>Hello AngularJS!</h1><div ng-transclude></div>"
}
});
模板缓存
run 方法会在注册器加载完所有模块之后被执行一次
$templateCache 可以缓存模板以供多个指令使用
put & get 类似面向对象的 setter & getter 方法
app.run(function($templateCache) {
$templateCache.put('hello.html', '<div>Hello AngularJS!</div>');
});
// use get method to get cache
app.directive('ele', function($templateCache) {
return {
template: $templateCache.get('hello.html')
}
});
compile 与 link
加载阶段
- 加载 angular.js,找到 ng-app 指令,确定应用的边界
编译阶段
- 遍历 DOM,找到所有指令
- 根据指令代码中的 template、replace、transclude 转换 DOM 结构
- 如果存在 compile 函数则调用
链接阶段
- 对每一条指令运行 link 函数
- link 函数一般用来操作 DOM、绑定事件监听器
指令调用控制器的方法,使用 link
HTML 代码
<loader howToLoad="loadData()">Hover to load</loader>
<loader howToLoad="loadData2()">Hover to load</loader>
AngularJS 代码
myModule.controller('MyCtrl', ['$scope',
function($scope) {
$scope.loadData = function() {
console.log('Loading...');
};
$scope.loadData2 = function() {
console.log('Loading2...');
}
}
]);
myModule.directive('loader', function() {
return {
resetrict: 'AE',
template: '',
replace: true,
link: function(scope, element, attr) {
// 绑定事件
element.bind('mouseenter', function() {
// 以下两种形式都可以,推荐下面的
scope.loadData();
scope.$apply('loadData()');
// 获取属性值
// 根据指令特定属性的不同应用不同方法
// 方法应小写
scope.$apply(attrs.howtoload);
});
}
}
});
指令之间的交互
重点是创建独立 scope,使得指令之间不互相影响
HTML 代码
<superman strength>Strength</superman>
<superman strength speed>Strength & Speed</superman>
<superman strength speed light>Stength & Speed & Light</superman>
AngularJS 代码
myModule.directive('superman', function() {
return {
// 创建独立 scope
scope: {},
restrict: 'AE',
// 希望指令暴露出一些方法编写在 controller 里面供其他指令调用
// 同时使用 this 指代 $scope,这样交互的指令才能引用
controller: function($scope) {
$scope.abilities = [];
this.addStrength = function () {
$scope.abilities.push('Strength');
};
this.addSpeed = function () {
$scope.abilities.push('Speed');
};
this.addLight = function () {
$scope.abilities.push('Light');
};
},
// link 处理指令内部事件
link: function (scope, element, attrs) {
element.addClass('btn btn-primary btn-lg');
element.bind('mouseenter', function() {
console.log(scope.abilities);
});
}
};
});
myModule.directive('strength', function() {
return {
// 依赖于 superman 指令,这样 link 函数才可以调用 supermanCtrl 参数
require: '^superman',
link: function(scope, element, attrs, supermanCtrl) {
supermanCtrl.addStrength();
}
};
});
myModule.directive('speed', function() {
return {
require: '^superman',
link: function(scope, element, attrs, supermanCtrl) {
supermanCtrl.addSpeed();
}
};
});
myModule.directive('light', function() {
return {
require: '^superman',
link: function(scope, element, attrs, supermanCtrl) {
supermanCtrl.addLight();
}
};
});
AngularJS Directive 学习笔记的更多相关文章
- AngularJS的学习笔记(一)
声明:单纯作为我自己的学习笔记,纯是为了自己学习,上面的话都是从各处粘贴,如有冒犯,请原谅我这个小菜鸟~ AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷. 使用双大括 ...
- angularJS Directive学习
Directive 指令 直接上实例 index.html <!doctype html> <html ng-app="drag"> <head> ...
- AngularJs初步学习笔记(part1)
一.摘要: angular是采用JavaScript编写的前端mvc框架,帮助开发者编写现代化的单页面应用.它尤其适用编写有大量CRUD操作的,具有Ajax风格的客户端应用. 二.总结: Angula ...
- angularjs directive学习心得
一些常见的错误 在angularjs里,创建directive时,directive的名称应该要使用驼峰式,例如myDirective,而在html里要调用它的时候,就不能用驼峰式了,可以用my-di ...
- 【angularJS】学习笔记
一.一个html中多个ng-app //对于ng-app初始化一个AngularJS程序属性的使用需要注意,在一个页面中AngularJS自动加载第一个ng-app,其他ng-app会忽略 //如果需 ...
- AngularJS 系列 学习笔记 目录篇
目录: AngularJS 系列 01 - HelloWorld和数据绑定 AngularJS 系列 02 - 模块 (持续更新)
- AngularJS的学习笔记(二)
只给自己看的. AngularJS 表达式 angularjs 使用表达式将数据绑定到html中. AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表 ...
- day65—angularJS的学习笔记1
转行学开发,代码100天—2018-05-20 AngularJS的引用示例: <!DOCTYPE html> <html> <head> <title> ...
- AngularJs学习笔记--directive
原版地址:http://code.angularjs.org/1.0.2/docs/guide/directive Directive是教HTML玩一些新把戏的途径.在DOM编译期间,directiv ...
随机推荐
- 查看ORACLE中正在运行的存储过程 kill
1:登陆PLSQL Developer,写一个存储过程,向一个表中插入值,并运行存储过程 2:打开PLSQL Developer的命令窗口 .--终止procedure 11.select * f ...
- J2SE知识点摘记-数据库(二)
一. 查询数据 注意sql的内容. 通过ResultSet接口保存全部的查询结果,通过Statement接口中的executeQuery()方法查询.查询之后需要分别取出.通过nex ...
- opencv 图像修复函数
void cv::inpaint( const Mat& src, const Mat& mask, Mat& dst, double inpaintRange, int fl ...
- 多个target下编译的时候出错问题的解决
在工程里如果有多个target的时候,如图 那么编译的时候一定要注意Xcode右侧勾选了正确的target,否则有可能会导致一系列让你想不到的bug. ,另外,如果工程中有framework,那么一定 ...
- CodeForces - 61E Enemy is weak
Description The Romans have attacked again. This time they are much more than the Persians but Shapu ...
- 在WHERE子句中引用取别名的列
版权说明:作者:张颖希(PocketZ's Blog)出处:http://www.cnblogs.com/PocketZ本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页 ...
- Java中Lambda表达式的使用
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...
- BZOJ 4311: 向量( 按时间分治 + 线段树 )
离线, 然后按时间分治, 每个向量都有出现时间[l, r], 直接插入时间线段树(一个向量只会影响O(logN)数量级的线段树节点). 在线段树每个节点弄出凸壳然后二分. 时间复杂度O(Nlog^2N ...
- hive支持sql大全
转自:http://www.aboutyun.com/thread-7316-1-1.html 一.关系运算:1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B ...
- Excel VLOOKUP等使用记录
1.LEFT 函数:LEFT(G2,ROW(INDIRECT("76:"&LEN(G2)))) 截取G2单元格从开头,SIZE=76的部分字符串 2.RIGHT 函数:RI ...