AngularJS之directive

  AngularJS是什么就不多舌了,这里简单介绍下directive。内容基本上是读书笔记,所以如果你看过《AngularJS up and running》,那么这个可以忽略。

  1、在AngularJS中,directives有两个主要的类型:1⃣️UI展示的修改器,如ng-show、ng-model2⃣️可复用的组件,如菜单、轮播器、taps等。
  2、directives定义:

 angular.module('stockMarketApp', []) .directive('stockWidget', [function() {
  return {
3     // Directive definition will go here
}; }]);
  需要注意的是,定义的名字采取驼峰命名,而在HTML中应用应该是-连接。如上面的定义应该为:<div stock-widget></div>
  3、templateUrl,注意的是AngularJS只会在第一次碰到directive的时候去取一次,然后会缓存起来,之后都是从缓存中读取。定义如下:

 angular.module('stockMarketApp') .directive('stockWidget',         [function() {
  return {
3     templateUrl: 'stock.html'
  };
}]);
  4、如果HTML比较小的话,可以直接写行内HTML,放在directive定义的template属性中。
  5、Restrict属性:
The restrict keyword defines how someone using the directive in their code might use it. As mentioned previously, the default way of using directives is via attributes of existing elements (we used <div stock-widget> for ours).
When we create our directive, we have control in deciding how it’s used. The possible values for restrict (and thus the ways in which we can use our directive) are:
A
The letter A in the value for restrict specifies that the directive can be used as an attribute on existing HTML elements (such as <div stock-widget></div>). This is the default value.
E
The letter E in the value for restrict specifies that the directive can be used as a new HTML element (such as <stock-widget></stock-widget>).
C
The letter C in the value for restrict specifies that the directive can be used as a class name in existing HTML elements (such as <div class="stock-widget"> </div>).
M
The letter M in the value for restrict specifies that the directive can be used as HTML comments (such as <!-- directive: stock-widget -→). This was previ‐ ously necessary for directives that needed to encompass multiple elements, like multiple rows in tables, etc. The ng-repeat-start and ng-repeat-end directives were introduced for this sole purpose, so it’s preferable to use them instead of com‐ ment directives.
 
  其中,A是默认的。同时,既可以单独使用,也可以多个一起用。比方说AE,既可以作为属性,也可以作为元素单独用。
  6、link函数,对于directive来说link函数的作用跟controller对于view的作用一样,它定义API和必要的函数。对于每一个directive的实例,AngularJS都会执行其link函数,因此包含其完整的业务逻辑,也不会影响到其它的实例。其定义会传递几个固有的参数,分别为directive元素的$scope、元素本身$element、元素上的属性$attrs,定义如下:
 link: function($scope, $element, $attrs) {}
  其中,完整定义如下:
 angular.module('stockMarketApp') .directive('stockWidget', [function() {
  return {
    templateUrl: 'stock.html',
    restrict: 'AE',
    link: function($scope, $element, $attrs) {
    $scope.getChange = function(stock) {
      return Math.ceil(((stock.price - stock.previous) /
stock.previous) * 100);
};
  } };
}]);
  7、Scope,默认的情况下,directive都继承其父元素的scope,并传递到link函数当中。这会导致一些如下的问题:1⃣️新增的变量和函数会默认修改父元素的scope,其父元素的scope莫名多了属性和方法2⃣️可能会无意覆盖掉父元素scope的函数或者变量3⃣️directive可以隐式的引用父元素的函数或者变量。因此,在定义directive的时候,AngularJS给了我们scope这个key,从而使我们能控制scope,其可用的值如下:
By default, each directive inherits its parent’s scope, which is passed to it in the link function. This can lead to the following problems:
• Adding variables/functions to the scope modifies the parent as well, which suddenly gets access to more variables and functions.
• The directive might unintentionally override an existing function or variable with the same name.
• The directive can implicitly start using variables and functions from the parent. This might cause issues if we start renaming properties in the parent and forget to do it in the directive.
  注意:false是默认的值,即使用父元素传递下来的scope。其中object是最强大的,其不继承父元素的scope,从传统scope的树形中脱离开来,隔离开来,需要directive使用的数据需要父元素在directive引用的时候通过HTML属性传递进来,其传递的值可以分为暗中类别,如下:
false
This is the default value, which basically tells AngularJS that the directive scope is the same as the parent scope, whichever one it is. So the directive gets access to all the variables and functions that are defined on the parent scope, and any modifi‐ cations it makes are immediately reflected in the parent as well.
true
This tells AngularJS that the directive scope inherits the parent scope, but creates a child scope of its own. The directive thus gets access to all the variables and func‐ tions from the parent scope, but any modifications it makes are not available in the parent. This is recommended if we need access to the parent’s functions and infor‐ mation, but need to make local modifications that are specific to the directive.
object
We can also pass an object with keys and values to the scope. This tells AngularJS to create what we call an isolated scope. This scope does not inherit anything from the parent, and any data that the parent scope needs to share with this directive needs to be passed in through HTML attributes. This is the best option when cre‐ ating reusable components that should be independent of how and where they are used.
  8、Replace参数,之前的所有directive在应用到HTML中的时候都会被当做子元素插入进去,可是有的时候我们需要其单独作为一个元素使用,这个时候就可以用到replace参数了。默认设置为false,即作为子元素插入进去。当设置为true的时候,directive的template会替换当前元素,同时旧元素上的属性都会移到新元素上。 
 

AngularJS之directive的更多相关文章

  1. Angularjs之directive指令学习笔记(二)

    1.Directive的五个实例知道driective作用.其中字段restrict.template. replace.transclude.link用法 参考文章链接地址:http://damoq ...

  2. 前端angularJS利用directive实现移动端自定义软键盘的方法

    最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后 ...

  3. Angularjs的directive封装ztree

    一般我们做web开发都会用到树,恰好ztree为我们提供了多种风格的树插件. 接下来就看看怎么用Angularjs的directive封装ztree <!DOCTYPE html> < ...

  4. angularJS中directive父子组件的数据交互

    angularJS中directive父子组件的数据交互 1. 使用共享 scope 的时候,可以直接从父 scope 中共享属性.使用隔离 scope 的时候,无法从父 scope 中共享属性.在 ...

  5. angularJS中directive与directive 之间的通信

    上一篇讲了directive与controller之间的通信:但是我们directive与directive之间的通信呢? 当我们两个directive嵌套使用的时候怎么保证子directive不会被 ...

  6. angularJS中directive与controller之间的通信

    当我们在angularJS中自定义了directive之后需要和controller进行通讯的时候,是怎么样进行通讯呢? 这里介绍3种angular自定义directive与controller通信的 ...

  7. AngularJS之Directive,scope,$parse

    AngularJS内幕详解之 Directive AngularJS内幕详解之 Scope AngularJS的指令(Directive) compile和link的区别及使用示例 浅谈Angular ...

  8. AngularJS中Directive指令系列 - scope属性的使用

    文章是转的,我做下补充.原文地址:https://segmentfault.com/a/1190000002773689 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部 ...

  9. 通过angularjs的directive以及service来实现的列表页加载排序分页

    前两篇:(列表页的动态条件搜索,我是如何做列表页的)分别介绍了我们是如何做后端业务系统数据展示类的列表页以及动态搜索的,那么还剩下最重要的一项:数据展示.数据展示一般包含三部分: 数据列头 数据行 分 ...

随机推荐

  1. calender 软文

    http://www.cnblogs.com/cloudgamer/archive/2008/08/23/1274459.html

  2. eclipse新建文件模板默认charset=ISO-8859-1解决

    在安装目录下找到eclipse.ini用记事本打开,添加一行-Dfile.encoding=utf-8,就ok了. 这是应为模板中使用了encoding这个变量

  3. Mac小知识(不定时更新)

    1.显示隐藏文件夹(在mac命令行中输入以下代码即可): 1)显示隐藏文件夹 defaults write com.apple.finder AppleShowAllFiles Yes &&a ...

  4. 利用win服务定时为网卡启用/禁用

    上周,Boss和我说,他儿子夜里爬起来用笔记本在被窝里玩CF,问路由器可以解决么,我看了是TPLINK的普通家用无线路由器,不支持禁用CF客户端网游,可以通过配置端口屏蔽什么的,但是白天又要开启,想想 ...

  5. EasyUI 开发笔记(一)

    由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...

  6. c#小小总结(设计模式)

    前言 对于设计模式,知道一些(当然有些仅限于知道而已) 内容 1.单例模式 2.建造者模式 把单个模块通过不同的搭配方式创造出不同的产品 3.观察者模式 一对多的行为 当“一”改变的时候  “多”的每 ...

  7. 【php学习】PHP 入门经典第一章笔记

    第一章: php在线手册:http://php.net/manual/zh/index.php 在开始学习PHP之前,先来看一个合格的PHP程序员今后应具备哪些知识,这里只是笔者的一些总结,希望对读者 ...

  8. ios系统(苹果手机)按钮显示为圆角和渐变的问题

    按钮在安卓手机上显示正常,但在苹果手机上会显示如下: 解决办法:给该按钮的样式加上:-webkit-appearance:none;这样按钮就会显示正常

  9. java可变参数

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持 ...

  10. MyEclipse JAX-WS Web Service

    在Myeclipse8.5下开发Web service程序,目前系统支持的开发框架有3个,JAX-WS,REST(JAX-RS),XFire.其中系统建议不要使用XFire 的框架,可能是要被淘汰了( ...