angular自定义指令,意我们可以通过angula自己定义指令,来实现我们的特殊要求,为所欲为,一支穿云箭,千军万马来相见

多少年的老规矩了,先看代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  7. <title>test</title>
  8. </head>
  9. <body ng-app="myApp">
  10. <my-title></my-title>    //元素my-title
  11. <div my-title></div> //属性my-title
  12. <div class="my-title"></div>//类my-title
  13. <!-- directive: my-title -->//注释my-title(注意一定要加directive)
  14. <script src="angular.min.js"></script>
  15. <script>
  16. var app = angular.module("myApp", [])
  17.  
  18. app.directive("myTitle", function(){ //myTitle与上面的my-title对应, 这里要写驼峰式,上面写 - 式
  19. return {
  20. restrict: 'ECMA', //指令作用域,E表示作用于元素,C表示作用于类(class),M表示作用于注释,A表示作用于元素属性
  21. template: '<h1>还有谁</h1>', //模板,将模板内容显示在对应区域(按照restrict显示)
    22 replace: true       //用模板标签替换掉注释标签,使得注释内容能在网页内显示出来 (即:设置为true可以替换标签,false只能替换文本内容)
  22. }
  23. })
  24.  
  25. </script>
  26. </body>
  27. </html>

transclude

transclude可以将被替换掉的文本内容显示到指定位置,用法如下:

transclude: true; ng-transclude;配合使用

  1. <div my-title>德莱联盟</div>
  1. app.directive("myTitle", function(){
  2. return {
  3. restrict: 'AM',
  4. template: '<span><div ng-transclude>德莱联盟</div>德玛西亚</span>',
  5. replace: true,
  6. transclude: true
  7. }
  8. })

templateUrl

通过templateUrl可以用外部文本、标签替换内部文本、标签,注:要在localhost协议下测试

  1. app.directive("myTitle", function(){
  2. return {
  3. restrict: 'AM',
  4. templateUrl: 'time.html' //加入外部文件url
  5. }
  6. })

如上,我们可以通过自定义指令,来渲染页面,当然自定义指令也可以加在控制器里,这时控制器作用域作为父作用域,如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  7. <title>test</title>
  8. </head>
  9. <body ng-app="myApp">
  10. <my-title></my-title>
  11. <div my-title></div>
  12. <div class="my-title"></div>
  13. <!-- directive: my-title -->
  14. <div ng-controller="myCtr">
  15. <input type="text" ng-model="msg">
  16. <p my-title msg-data="{{msg}}">{{msg}}</p>
  17. <h1>{{msg}}</h1>
  18. </div>
  19.  
  20. <script src="angular.min.js"></script>
  21. <script>
  22. var app = angular.module("myApp", [])
  23. .controller('myCtr', function($scope){
  24. $scope.msg = "德玛西亚";
  25. })
  26. .directive("myTitle",function(){
  27. return {
  28. restrict: 'A',
  29. controller: function($scope){
  30. $scope.msg = "还有谁";
  31. },
  32. scope: true      //默认是false,表示其作用域和父作用域相同,当为true时表示他们有各自的作用域互不干扰
  33. }
  34. })
  35.  
  36. </script>
  37. </body>
  38. </html>

看上面代码,不难发现angularJS支持连缀,这是因为angular的方法会返回一个对象即上面的"app",所以其可以像jQuery一样连缀

scope还可以是一个对象,如:

  1. template: '<em>{{msg}}</em>', //将父作用域msg变斜体后以模板的形式加载到子作用域
  2.  
  3. scope: {
  4. msg: '@msgData' //对应上面代码的msg-data,其功能是将子作用域msg指向父作用域msg,便于上一步中的模板加载操作
  5. }

这样一来,子作用域的p标签也会渲染为 "德玛西亚"

通过上面分析,我们发现可不可以在自定义指令中自定义方法呢?答案是可疑的,那就是link闪亮登场的时候了,我的大刀早已饥渴难耐了!!!

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  7. <title>test</title>
  8. </head>
  9. <body ng-app="myApp">
  10. <div repeat-num="3">我爱中华 //自定义指令,将div重复渲染3次
  11.  
  12. </div>
  13.  
  14. <script src="angular.min.js"></script>
  15. <script>
  16. var app = angular.module("myApp", []);
  17.  
  18. app.directive("repeatNum", function(){
  19. return {
  20. restrict: 'A',
  21. link: function(m,T,bc) {    //这三个参数是通过console.log(this);console.log(arguments);来查看的
  22. var num = bc.repeatNum;  //获取上面repeat-num的值
  23. console.log(this);
  24. console.log(arguments);
  25. for(var i = 0; i < num; i++){ //for循环实现多次渲染
  26. var cDom = T.clone(); //克隆div
  27. T.after(cDom); //将克隆好的div加在现有的div之后
  28. }
  29. }
  30.  
  31. }
  32. })
  33.  
  34. </script>
  35. </body>
  36. </html>

如上图所示link方法共有5个参数其中三个是:m、T、bc,m表示作用域,T表示自定义指令作用的元素即div,bc表示其属性

当然了我们也可以对其子元素自定义操作,即多次渲染等,如下代码片段:

  1. <div repeat-num="3">
  2. <h1>我以为你不会选我呢</h1>
  3. </div>
  1. app.directive("repeatNum", function(){
  2. return {
  3. restrict: 'A',
  4. link: function(m,T,bc) {
  5. var num = bc.repeatNum;
  6. var cDom = T.children();   //找到自定义指令操作元素的子节点
  7. for(var i = 0; i < num; i++){
  8. T.append(cDom.clone()); //将其子元素克隆并加入父元素
  9. }
  10. }
  11. }
  12. })

上述即为自定义指令的用法,欢迎再次光临召唤师峡谷。

女士们、先生们,today is history, today we make history, today is part of history.

Angular自定义指令(directive)的更多相关文章

  1. angular 自定义指令 directive transclude 理解

    项目中断断续续的用了下angular,也没狠下心 认真的学习.angular 特别是自定义指令这块 空白. transclude 定义是否将当前元素的内容转移到模板中.看解释有点抽象. 看解释有点抽象 ...

  2. Angular自定义指令directive:scope属性

    在AngularJS中,除了内置指令如ng-click等,我们还可以自定义指令.自定义指令,是为了扩展DOM元素的功能.代码中,通过指定directive中的restrict属性,来决定这个指令是作为 ...

  3. angular 自定义指令详解 Directive

    在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...

  4. Angular之指令Directive系列

    项目筹备近期开启Angular学习,指令比较难理解所以记录备案,推荐Angualr实战学习视频大漠穷秋 Angular实战 一.指令directive概述 指令可以对元素绑定事件监听或者改变DOM结构 ...

  5. angularjs - 自定义指令(directive)

    自定义指令(directive) 使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名. 例子:使用驼峰法来命名一个指令, demoDirect ...

  6. angularjs自定义指令Directive

    今天学习angularjs自定义指令Directive.Directive是一个非常棒的功能.可以实现我们自义的的功能方法. 下面的例子是演示用户在文本框输入的帐号是否为管理员的帐号"Adm ...

  7. vue从入门到进阶:自定义指令directive,插件的封装以及混合mixins(七)

    一.自定义指令directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的 ...

  8. Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入

    前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...

  9. -_-#【Angular】自定义指令directive

    AngularJS学习笔记 <!DOCTYPE html> <html ng-app="Demo"> <head> <meta chars ...

随机推荐

  1. iOS--手势之谜

    原文转至: http://www.cnblogs.com/huangjianwu/p/4675648.html iOS在手机APP的手势操作中包含了:拖动.捏合.旋转.点按.长按.轻扫.自定义等等,详 ...

  2. T-Sql编程基础

    T-sql编程 入门小游戏 T-sql编程基础,包括声明变量,if判断,while循环,以及使用一些基本函数. 记得在学校的时候,写过一个二人对打的文字输出游戏. 上代码 alter proc usp ...

  3. Linux 硬盘分区生效命令partprobe

    在Linux中使用fdisk命令进行分区时,有时会遇到"WARNING: Re-reading the partition table failed with error 16: Devic ...

  4. MS SQL专用管理员连接DAC

    在SQL SERVER 2005中,微软引入了一个叫做数据库专用管理员连接方式(DAC Dedicated Administrator Connection)的特性,使用这个新特性,数据库管理员可以在 ...

  5. [20141121]无法通过powershell读取sql server性能计数器问题

    背景: 全新服务器,需要增加性能监控,发现无法通过powershell读取性能指标 解决方法: Open the Registry Editor by going to the Start Menu ...

  6. CSS补充与JavaScript基础

    一.CSS补充 position 1.fiexd 固定在页面的某个位置; 示例将顶部菜单始终固定在页面顶部 position: fixed; 将标签固定在某个位置 right: 0; 距离右边0像素 ...

  7. android 关闭/开启软件键盘(hideSoftKeyboard)

    /** * 隐藏软键盘 * @param v */ public static void hideSoftKeyboard(View v) { InputMethodManager imm = (In ...

  8. java操作hdfs实例

    环境:window7+eclipse+vmware虚拟机+搭建好的hadoop环境(master.slave01.slave02) 内容:主要是在windows环境下,利用eclipse如何来操作hd ...

  9. 【2016-11-5】【坚持学习】【Day20】【通过委托事件,关闭窗口】

    Window1 UserControl viewModel 在viewModel 关闭window1

  10. 【第一篇献给markdown】markdown入门

    Markdown 是一种轻量级的「标记语言」,语法十分简单,常用的标记符号也不超过十个.虽然功能很强大,但是上手估计不用十分钟. 一些认识 Markdown 官方文档 这里可以看到官方的 Markdo ...