我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Angular.JS中指令的参数有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Angular.JS中指令的参数有哪些

Angular.JS中指令的参数有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

指令的参数

angular.module('app', []).directive('myDirective', function() { return { restrict: String,  priority: Number, terminal: Boolean, template: String or Template Function: function(tElement, tAttrs) {...}, templateUrl: String, replace: Boolean or String, scope: Boolean or Object, transclude: Boolean, controller: String or function(scope, element, attrs, transclude, otherInjectables) { ... }, controllerAs: String, require: String, link: function(scope, iElement, iAttrs) { ... }, compile: // 返回一个对象或连接函数,如下所示: function(tElement, tAttrs, transclude) { return { pre: function(scope, iElement, iAttrs, controller) { ... }, post: function(scope, iElement, iAttrs, controller) { ... } } return function postLink(...) { ... } } }; });

把它们分成三类:

  1. 描述指令或DOM本身特性的内部参数

  2. 连接指令外界、与其他指令或控制器沟通的对外参数

  3. 描述指令本身行为的行为参数

内部参数

  • restrict:String,E(元素)<my-directive></my-directive> A(属性,默认值)<div my-directive="expression"></div> C(类名)<div class="my-directive:expression;"></div> M(注释)<--directive:my-directive expression-->

  • priority: Number,指令执行优先级

  • template: String,指令链接DOM模板,例如“<h2>{{head}}</h2>”

  • templateUrl:String,DOM模板路径

  • replace: Boolean,指令链接模板是否替换原有元素,

对外参数——scope

scope参数非常重要,本应该是放到最后说明的,但是scope却是理解其他参数的关键,所以务必先跟大家说清楚。

scope参数的作用是,隔离指令与所在控制器间的作用域、隔离指令与指令间的作用域。

scope参数是可选的,默认值为false,可选true、对象{};

  • false:共享父域

  • true:继承父域,且新建独立作用域

  • 对象{}:不继承父域,且新建独立作用域

false、true、{}三者对比

来看个例子

<body> <div ng-controller='parentCtrl'> <h4>指令scope参数——false、true、{}对比测试</h4> parent: <div> <span> {{parentName}}</span> <input type="text" ng-model="parentName" /> </div> <br /> <child-a></child-a> <br /> <child-b></child-b> <br /> <child-c parent-name="parentName"></child-c> </div> <!--t1指令模板--> <script type="text/html" id="t1"> <div> <span>{{parentName}}</span> <input type="text" ng-model="parentName" /> </div> </script> <script> var app = angular.module("app", []); app.controller('parentCtrl', function ($scope) { $scope.parentName = "parent"; }) //false:共享作用域 app.directive('childA', function () { return { restrict: 'E', scope: false, template: function (elem, attr) {  return "false:" + document.getElementById('t1').innerHTML; } }; }); //true:继承父域,并建立独立作用域 app.directive('childB', function () { return { restrict: 'E', scope: true, template: function (elem, attr) {  return "true:" + document.getElementById('t1').innerHTML; }, controller: function ($scope) {  $scope.parentName = "parent";  //已声明的情况下,$scope.$watch监听的是自己的parentName  $scope.$watch('parentName', function (n, o) {  console.log("child watch" + n);  });  //$scope.$parent.$watch监听的是父域的parentName  $scope.$parent.$watch('parentName', function (n, o) {  console.log("parent watch" + n);  }); } }; }); //{}:不继承父域,建立独立作用域 app.directive('childC', function () { return { restrict: 'E', scope: {}, template: function (elem, attr) {  return "{}:" + document.getElementById('t1').innerHTML; }, controller: function ($scope) {  console.log($scope); } }; }); </script></body>

false参数

本质:子域与父域共享作用域。

特点:父域修改parentName的同时,指令绑定的parentName的元素会被刷新。

Angular.JS中指令的参数有哪些 

反之,指令内部parentName被修改时,父域的parentName同样会被刷新。

Angular.JS中指令的参数有哪些 

true参数

本质:子域继承父域,并建立独立作用域。

特点:

在指令已声明parentName的情况下,父域parentName变更,指令中parentName不会发生变化。
指令在true参数下,建立了的scope,独立并隔离与父控制器的scope。

controller: function ($scope) { $scope.parentName = "parent";}

Angular.JS中指令的参数有哪些

反之,指令中parentName变更,父域也不会发生变化。

Angular.JS中指令的参数有哪些 

在指令未声明parentName的情况下,父域的parentName变更,指令中parentName也会刷新
这种情况很多时候会被忽略,指令的scope没有声明对象时,其元素绑定的仍然是父域的对象。但,一旦指令中Input变更了,对应的独立scope也会自动声明该绑定对象,这就回到了第1种情况。

controller: function ($scope) { //$scope.parentName = "parent";}

Angular.JS中指令的参数有哪些

然而,指令中parentName变更,父域是不会变化的;

Angular.JS中指令的参数有哪些 

在指令已声明parentName的情况下 ,在指令中监听父域parentName 的变化无效。但监听子域parentName的变化有效
独立子域scope,只能监听自己的,不能监听父域的。但通过 $scope.$parent可以监听父域。

controller: function ($scope) { $scope.parentName = "parent" ; //已声明的情况下,$scope.$watch监听的是自己的parentName $scope.$watch( 'parentName' , function (n, o) { console.log("child watch" + n); }); //$scope.$parent.$watch监听的是父域的parentName $scope.$parent.$watch( 'parentName' , function (n, o) { console.log("parent watch" + n); });}

Angular.JS中指令的参数有哪些

在指令未声明parentName的情况下 ,在指令中监听父域parentName的变化有效。

这里就不解释了,参考第2点,大家可以动手试一下。

controller: function ($scope) { //$scope.parentName = "parent"; //未声明的情况下,$scope.$watch监听的是父域的parentName $scope.$watch('parentName' , function (n, o) { console.log("child watch" + n); });}

对象{}参数

本质:子域不继承父域,并建立独立作用域。

特点:

当scope对象为空对象时,无论是父域parentName,还是指令子域parentName发生变更,都不会影响到对方。
原理很清楚,就是指令建立的独立作用域,与父域是完全隔离的。

scope: {}

Angular.JS中指令的参数有哪些 

当scope对象为非空对象时,指令会将该对象处理成子域scope的扩展属性。而父域与子域之间传递数据的任务,就是可以通过这块扩展属性完成。

<div ng-controller='parentCtrl'> parent: <p><span>{{name}}</span><input type="text" ng-model="name" /></p> <p><span>{{sexy}}</span><input type="text" ng-model="sexy" /></p> <p><span>{{age}}</span><input type="text" ng-model="age" /></p> <br /> <!--特别注意:@与=对应的attr,@是单向绑定父域的机制,记得加上{{}};&对应的attrName必须以on-开头--> <child-c my-name="name" my-sexy-attr="sexy" my-age="{{age}}" on-say="say('i m ' + name)"></child-c></div><!--t1指令模板--><script type="text/html" id="t1"> <div> <span>{{myName}}</span> <input type="text" ng-model="myName" /> </div> <div> <span>{{mySexy}}</span> <input type="text" ng-model="mySexy" /> </div> <div> <span>{{myAge}}</span> <input type="text" ng-model="myAge" /> </div></script><script> var app = angular.module("app", []); app.controller('parentCtrl', function ($scope) { $scope.name = "mark"; $scope.sexy = "male"; $scope.age = "30"; $scope.say = function (sth) {  alert(sth); }; }) app.directive('childC', function () { return {  restrict: 'E',  scope: {  myName: '=',  mySexy: '=mySexyAttr',  myAge: '@',  onSay: '&'  },  template: function (elem, attr) {  return "{}:" + document.getElementById('t1').innerHTML;  },  controller: function ($scope) {  console.log($scope.myName);  console.log($scope.mySexy);  console.log($scope.myAge);  $scope.onSay();  } }; });</script>

@(or @Attr)绑定策略——本地作用域属性,使用@符号将本地作用域同DOM属性的值进行绑定。指令内部作用域可以使用外部作用域的变量。(单向引用父域对象)

<child-c my-age="{{age}}"></child-c>

ps:@ 是单向绑定本地作用域,记得加上{{}}

scope: {   myAge: '@',}

Angular.JS中指令的参数有哪些

= (or =Attr)绑定策略——双向绑定:通过=可以将本地作用域上的属性同父级作用域上的属性进行双向的数据绑定。就像普通的数据绑定一样,本地属性会反映出父数据模型中所发生的改变。(双向引用父域对象)

<child-c onSay="name"></child-c>

ps:=策略不需要加上{{}}进行绑定

scope: {   myName: '=',}

Angular.JS中指令的参数有哪些

& (or &Attr)绑定策略——通过&符号可以对父级作用域进行绑定,以便在其中运行函数。(调用父域函数)

<child-c on-say="say('i m ' + name)"></child-c>

ps:&对应的attrName必须以on-开头

scope: {   onSay: '&',}

父域绑定调用函数及传参

app.controller('parentCtrl', function ($scope) { $scope.say = function (sth) {  alert(sth); };})

Angular.JS中指令的参数有哪些

ps特别注意:@与=对应的attr,;

<child-c my-name="name" my-sexy-attr="sexy" my-age="{{age}}" on-say="say('i m ' + name)"></child-c>

总结下来,scope扩展对象,既能够解耦父域与子域共域的问题,也能够实现指令与外界通讯的问题,是Angular开发指令化模块化的重要基础。在往后的章节,我会向大家介绍指令化开发的更多实例。

对外参数——require

scope是指令与外界作用域通讯的桥梁,而require是指令与指令之间通讯的桥梁。这个参数最大的作用在于,当要开发单指令无法完成,需要一些组合型指令的控件或功能,例如日期控件,通过require参数,指令可以获得外部其他指令的控制器,从而达到交换数据、事件分发的目的。

使用方法:require: String or Array——String值为引入指令名称,并且有两个寻找指令策略符号‘?'与‘^';Array数组则为多个外部指令名称。

在link函数第4个参数ctrl中获取注入外部指令的控制器,如果require为String,ctrl为对象,如果require是数组,ctrl为数组。

require: '^teacher1',link: function ($scope, $element, $attrs, ctrl) { //ctrl指向teacher1指令的控制器}

?策略——寻找指令名称,如果没有找到,link函数第4个参数为null;如果没有?,则报错。

Angular.JS中指令的参数有哪些 

^ 策略——在自身指令寻找指令名称的同时,向上父元素寻找;如果没有^,则仅在自身寻找。
如下例子,指令studentA向上可以找到指令teacher及自身,但是不能找到相邻兄弟的student-b。

<div teacher> <student-a></student-a> <student-b></student-b></div>

完整例子

<body> <div teacher> {{name}} <student-a></student-a> <student-b></student-b> </div> <script> var app = angular.module("app", []); //studentA——require指向父级指令teacher app.directive('studentA', function () {  return {  require: '?^teacher',  scope: {},  template: '<div>A`s teacher name: <span>{{teacherName}}</span></div>',  link: function ($scope, $element, $attrs, ctrl) {   //获取teacher指令控制器,并调用其方法sayName()   $scope.teacherName = ctrl.sayName();  }  }; }); //studentB——require指向父级指令teacher,及指令studentA //但是,由于不能获得兄弟,也没有采取?策略,导致报错 app.directive('studentB', function () {  return {  require: ['?^teacher', 'studentA'],  scope: {},  template: '<div>B`s teacher name: <span>{{teacherName}}</span></div>',  link: function ($scope, $element, $attrs, ctrl) {   $scope.teacherName = ctrl.sayName();  }  }; }); app.directive('teacher', function () {  return {  restrict: 'A',  controller: function ($scope) {   $scope.name = "Miss wang";   //扩展控制器的方法sayName,目的是让外部内获取控制器内部数据   this.sayName = function () {   return $scope.name;   };  }  }; }); </script></body>

Angular.JS中指令的参数有哪些

既然require可以获取外部指令,那Angular原生指令应该也是能够获取。其中最广泛应用的就是require: 'ngModel',关于ngModel在自定义指令上的应用,留待下回实例中再跟大家深入讨论。

行为参数——link与controller

为什么要把link与controller两个参数放到一起?

因为很多童鞋会把它们错误地混淆使用,包括我自己。

link与controller都是描述指令行为的参数,但它们是要描述的行为是完全不同的类型。

controller语法 controller:String or Function

controller本身的意义就是赋予指令控制器,而控制器就是定义其内部作用域的行为的。

所以controller要描述的是:指令的作用域的行为。

//指向匿名控制器controller: function ($scope) {},//指向控制器mainCtrlcontroller: "mainCtrl"

link语法 link:String Or Function

link名称是链接函数,啥意思,好像挺难理解。所以在解释链接函数之前,先要说一下Angular的初始化对于指令究竟做了什么。

Angular在刚从HTTP Response接收静态素材之初,会首先去分析母页HTML中有哪些原生指令或自定义指令,然后再去加载指令的template模板HTML,而template模板中又去加载自己的指令模板,如此类推,直到Angular找到了所有的指令及模板,形成模板树,并返回模板函数,提供给下一阶段进行数据绑定。

<body> <stu1 ></ stu1> <script >  var app = angular.module("app" , []);  app.directive( 'stu1' , function () {   return {    restrict: 'E' ,    template: "<p>1</p><stu2></stu2>" ,    link: function (scope) {     console.log( 'stu1 running' );    }   };  });  app.directive( 'stu2' , function () {   return {    restrict: 'E' ,    template: "<p>2</p><stu3></stu3>" ,    link: function (scope) {     console.log( 'stu2 running' );    }   };  });  app.directive( 'stu3' , function () {   return {    restrict: 'E' ,    template: "<p>3</p>" ,    link: function (scope) {     console.log( 'stu3 running' );    }   };  }); </script ></ body> console outputstu3 runningstu2 runningstu1 running

Angular.JS中指令的参数有哪些

注意以上例子,在第一个断点stu3 running的时候,1 2 3 三个模板都渲染完成了。然后从最根部的stu3的link函数开始,依次执行stu 3 stu2 stu1的link函数。

简单来说就是:

  1. 加载模板,形成DOM模板树

  2. @@@@

  3. 数据绑定

@@@@是啥?没错,就是link链接函数,它会在形成模板树之后,在数据绑定之前,从最底部指令开始,逐个指令执行它们的link函数。

在这个时间节点的link函数,操作DOM的性能开销是最低,非常适合在这个时机执行DOM的操作,例如鼠标操作或触控事件分发绑定、样式Class设置、增删改元素等等。

所以link就是描述指令元素操作行为。

link: function (scope, element, attr, ctrl) { element.bind("click", function () {  console.log("绑定点击事件"); }); element.append("<p>增加段落块</p>"); //设置样式 element.css("background-color", "yellow"); //不推荐,在link中赋予scope行为 scope.hello = function () {  console.log("hello"); };}

同理,在link中定义$scope行为是不推荐的。

这样想想,对于controller与link,就明白了。但还有一个问题,它们俩的执行顺序是?答案是先controller,后link。

放到全局顺序就是:

  1. 执行controller,设置各个作用域scope

  2. 加载模板,形成DOM模板树

  3. 执行link,设置DOM各个行为

  4. 数据绑定,最后scope绑上DOM

例子

 <div student>  {{name }} </div> <script>  var app = angular.module("app", []);  app.directive('student', function () {   return {    restrict: 'A',    controller: function ($scope) {     $scope.name = "tgor";     console.log('controller running');    },    link: function (scope, el) {     el.append("<p>hello</p>");     console.log('link running');    }   };  }); </script>

Angular.JS中指令的参数有哪些

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Angular.JS中指令的参数有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Angular.JS中指令的参数有哪些

Angular.JS中指令的参数有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。指令的参数angular.module(app, []).directive
2023-05-31

linux中的awk命令参数有哪些

awk命令的常用参数如下:1. -F:指定输入字段的分隔符,默认为制表符。2. -v:定义一个变量并赋值。3. -f:指定一个包含awk脚本的文件。4. -i:就地修改文件,而不是输出到标准输出。5. -W:指定宽度用于显示输出。6. -O
2023-09-12

oracle中spool命令的参数有哪些

在Oracle中,spool命令用于将SQL查询结果输出到文件中。其参数包括:文件名:指定输出文件的名称。APPEND:可选参数,如果存在则在文件末尾追加内容,否则会覆盖原有内容。OFF:关闭spool功能,停止将查询结果输出到文件中。
oracle中spool命令的参数有哪些
2024-04-09

linux中netstat命令参数有哪些

netstat命令用于显示网络连接、路由表和网络接口信息。在Linux中,netstat命令有以下参数:- `-a`:显示所有的连接(包括监听和非监听状态)。- `-n`:以数字形式显示IP地址和端口号,而不使用域名或服务名。- `-t`:
2023-09-29

Linux中top命令参数有哪些

这篇文章将为大家详细讲解有关Linux中top命令参数有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。top命令用法top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中
2023-06-22

linux中ls命令参数有哪些

这篇文章主要介绍linux中ls命令参数有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、ls命令参数详解 可以通过阅读 ls 的说明书页(man ls)来获得选项的完整列表。 -a – 全部(all)。列举目
2023-06-09

Linux gcc命令的参数有哪些

本篇内容主要讲解“Linux gcc命令的参数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux gcc命令的参数有哪些”吧!Linux常用命令gcc命令 使用GNU推出的基于C/C
2023-06-28

Linux nano命令的参数有哪些

这篇文章主要介绍了Linux nano命令的参数有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux nano命令的参数有哪些文章都会有所收获,下面我们一起来看看吧。Linux系统是一个字符终端的文本
2023-06-28

docker images命令的参数有哪些

docker images命令的参数有:-a, --all:显示所有镜像,包括中间层映像--digests:显示镜像的摘要信息--filter filter:使用指定的过滤器来筛选镜像,例如根据镜像名称、标签、ID等过滤--forma
2023-10-26

Linux的mke2fs命令参数有哪些

这篇文章主要介绍“Linux的mke2fs命令参数有哪些”,在日常操作中,相信很多人在Linux的mke2fs命令参数有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的mke2fs命令参数有哪些
2023-06-27

Linux的rev命令参数有哪些

本篇内容主要讲解“Linux的rev命令参数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的rev命令参数有哪些”吧!rev命令将文件中的每行内容以字符为单位反序输出,即第一个字
2023-06-27

mysql source命令的参数有哪些

MySQL的source命令用于在命令行中执行SQL脚本文件,其参数如下:文件路径:指定要执行的SQL脚本文件的路径。选项:可以使用以下选项来调整source命令的行为:-v:显示执行的SQL语句。-t:将结果以文本形式显示,而不是表格
mysql source命令的参数有哪些
2024-04-09

Linux系统中ip route命令的参数有哪些

ip route命令的常用参数如下:- default:设置默认路由。- via:指定下一跳的IP地址。- dev:指定出口网络设备。- proto:指定协议类型,如static、kernel、bgp等。- table:指定路由表。- sc
2023-09-13

linux shell命令行参数有哪些

Linux shell命令行参数有以下几种常见类型:选项参数:以"-“或”–"开头的参数,用于控制命令的行为。例如,“ls -l"中的”-l"表示以长格式输出文件列表。位置参数:指定命令操作的目标对象或文件。例如,"cp file1 fi
linux shell命令行参数有哪些
2024-02-29

Vue中的常用指令有哪些

这篇文章主要介绍了Vue中的常用指令有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的常用指令有哪些文章都会有所收获,下面我们一起来看看吧。首先来聊聊Vue框架,Vue是一套用于构建用户界面的渐进式
2023-06-26

docker中有哪些基本的指令

这期内容当中小编将会给大家带来有关docker中有哪些基本的指令,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、查看当前机器的容器情况 通常情况下,我们可以使用docker ps命令来查看当前机器
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录