AngularJS中的指令

欢迎大家讨论与指导 : )

  明天天会继续更新本文O(∩_∩)O

 前言

  当AngularJS中的内置指令不能满足我们的需求,或者当我们需要创建一个能够用于多个AngularJS程序的自包含的功能单元时,我们应该创建自定义指令来满足需求。

 一、创建自定义指令

    一 . 1 命名规则 

  我们要在创建指令时使用峰驼式命名,例如指令是 <div unordered-list></div>  在声明指令时我们需要这样子写 app.directive("unorderedList", function(){..})  同理,当我们想要获取包含指令的元素的属性时,例如 <div unordered-list="product"></div> ,也要使用峰驼式的命名规则 var attrProduct = attrs["unorderedList"]

    一 . 2 从作用域中获取数据

  指令的link函数包含三个参数,分别是scope, element, attrs 其中,scope参数代表该指令被应用到的视图所在控制器的作用域。简单来说就是,这个指令当前在哪个controller的作用域下,scope就相当于这个作用域$scope了。假设,我们的"unorderedList"指令在defaultController控制器的作用域下,那么我们如何通过从这个作用域中获取我们所需要的$scope.product呢(这里举个例子)

app.controller("defaultController", [‘$scope‘, function($scope){
     $scope.product = [
      {name: ‘Apples‘, category: ‘Fruit‘, price: 1.20, expiry: 10},
      {name: ‘Bananas‘, category: ‘Fruit‘, price: 2.42, expiry: 7},
      {name: ‘Pears‘, category: ‘Fruit‘, price: 2.02, expiry: 6}
     ]
}]);

app.directive("unorderedList", function(){
     return function(scope, element, attrs){
       var data = scope[attrs["unorderedLsit"]]
     }
})    

  答案是通过为包含指令的元素的属性设置具体的值(这里为product),例如 <div unordered-list="product"></div> ,然后通过attrs属性获取这个具体的值 var data = scope[attrs["unorderedLsit"]]

  一 . 3 打破对数据属性的依赖

  对于指令函数中,我们应当尽量减少对代码过程的"假设",并通过为包含指令的元素增加具体的属性来增强指令的复用性。例如我们"假设"我们在上面例子所获取的data var data = scope[attrs["unorderedLsit"]] 中的每个item中都含有name属性,我们会这样子操作我们的代码:

for(var i = 0; i < data.length; i++){
     var str = data[i].name
     // .... "假设"有name属性
}

  但其实我们应该这样子操作  <div unordered-list="product" list-property="name"></div>  我们通过加入另一个list-property属性并为其赋上具体的值"name",来让我们不需要进行"假设",从而提高指令的复用率

for(var i = 0; i < data.length; i++){
     var property = attrs["listProperty"]
     var str = data[i].property
     // .... 不要进行"假设"
}

  一 . 4 使用$eval进行计算

  当我们指令的属性需要和filter过滤器或者其他一些组件一起工作的时候<div unordered-list="product" list-property="price | currency"></div> 例如这里,我们需要指令获取price属性,并且需要配合filter currency来进行预处理,我们应该怎么样操作呢? 答案是$eval,通过获取表达式并通过$eval运行,即可达到我们所需要的效果。注:$eval的第一个参数是具体的表达式,第二个参数是传到表达式进行计算的参数。

for(var i = 0; i < data.length; i++){
   var propertyExrpession = attrs["listProperty"]
   scope.$eval(propertyExrpession, data[i])
}

  一 . 5 响应数据的变化

  很多时候,当我们刷新数据时,我们会发现"绑定"到指令上的数据并没有发生相应的变化,这是为什么呢?原因是,很多时候我们所"绑定"的是指令在初始化时scope上的数据当应用运行起来时,并且我们没有为指令添加监听器的时候,指令上的数据便不会随着Model的数据改变而改变了。让我们来添加监听器吧

var watchFn = function(watchScope){
    return watchScope.$eval(propertyExpression, data[index]);
}
scope.$watch(watchFn, function(newVal, oldVal){
    itemElement.text(newVal);
})

  我们看到,在指令内部我们使用scope.$watch对一个函数进行监听。这里有几个值得注意的地方:1 . 使用$watch对一个函数进行监听,该函数会有一个参数(此处为watchScope)来表达监听者的作用域 。2 . 我们为什么要对一个函数,而不是某个值进行监听呢?因为这个函数所return的就是一个会改变的值。3 . 什么时候,这个会改变的值会进行变化呢?答案是当$eval函数上的第二个参数data发生改变时(在AngularJS中,当作用域的某个属性发生变化时,以它为依赖的函数也会重新进行计算。也就是说$scope.abc发生了变化,那么function someFun ($scope.abc){...} 也会重新计算一遍)。因为$eval重新运算因此其return的值也就有可能发生变化了。通过以上3点,我们可以使指令实时地绑定的,而不再是绑定指令初始化阶段的数据了

   一 . 6 闭包

  闭包带来的问题这里就不多说了,我们应该使用"立即调用的函数表达式"(IIFE)来解决这个问题。

for(var i = 0; i < data.length; i++){
     (function(){//建立IIFE
         var index = i;
         var someFun = function(index){
                //...
         }
     }())
}

 二、创建复杂指令

--------明天更新-------

  

  参考资料

  《AngularJS高级程序设计》P357

时间: 2024-10-12 10:46:20

AngularJS中的指令的相关文章

浅谈AngularJS中的指令和指令间的相互通信

说到AngularJS,我们首先想到的大概也就是双向数据绑定和指令系统了,这两者也是AngularJS中最为吸引人的地方.双向数据绑定呢,感觉没什么好说的,那么今天我们就来简单的讨论下AngularJS这个框架的指令系统. 指令作为AngularJS中最为重要的部分,所以这个框架本身也是自带了比较多的的指令,但是在开发中,这些指令通常不能满足我们的需要,所以我们也是需要自定义一些指令的.那么一个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用. <h

angularjs学习之六(angularjs中directive指令的一般编程事件绑定 模板使用等)

angular js 中模板的使用,事件绑定以及指令与指令之间的交互 对应教学视频地址(需翻墙):angularjs教学视频 <!doctype html> <html ng-app="myapp"> <head> <meta charset="utf-8"/> </head> <body ng-controller="ShieldController"> <div&g

angularJS中自定义指令

学习了angularJS一周,但是大部分时间被自定义指令占用了.博主表示自学互联网好心塞的,发现问题的视觉很狭窄,这比解决问题要更难.这篇文章首先介绍了自定义,然后介绍了在使用自定义指令遇到的问题. 代码模板: var myModule = angular.module("myModule",[]); myModule.directive('directiveName',function(){ return{ restrict:string, template:string, temp

Angularjs中编写指令模版

1 angular.module('moduleName', []).directive( 2 'namespaceDirectiveName', 3 [ function() { 4 return { 5 restrict : '',// 描述指令在模版中的使用方式,包括元素E,属性A,CSS样式类,注释或者以上方式的任意主和 6 priority : 0,// 设置指令在模版中的执行顺序,顺序是相对于其他指令而言 7 template : '',// 以字符串的形式编写一个内联模版,如果以u

AngularJS中Directive指令系列 - bindToController属性的使用

默认false.这个属性用来绑定scope的属性直接赋给controller.可以为true或者和scope相同格式的对象. 此外使用此属性,要设置controller的别名,通常通过"controllerAs"来设置. 如果一个directive里同时使用了bindToController和scope,并且是object.那么bindToController会覆盖scope.

AngularJs中的directives(指令)

一.指令的职责   指令的职责是修改DOM结构,并将作用域和DOM连接起来.即指令既要操作DOM,将作用域内的数据绑定到DOM节点上,又要为DOM绑定事件调用作用域内的对应的方法. 二.创建自定义指令 调用自定义指令的4种方式:元素.属性.样式类.注释. 常用的是前两种,实例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title>

走进AngularJs(二) ng模板中常用指令的使用方式

通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板开始入手是个不错方式,因为这部分内容相对简单好理解,而且是视图层的东西,大家都喜欢可以立马看得见的东西嘛.本篇我将搜罗模板中的常用指令一一测试,了解其使用方法,有点像背单词的感觉,会比较枯燥.不过对于初学,这样的枯燥是必须要经历的,开始~ 一.模板中可使用的东西及表达式 模板中可以使用的东西包括以下

angularJS中的ng-show、ng-if指令

angularJS中的ng-show.ng-hide.ng-if指令都可以用来控制dom元素的显示或隐藏. 1. ng-show和ng-hide 根据所给表达式的值来显示或隐藏HTML元素.元素会渲染出来,只是通过css隐藏了. 即DOM中会存在, 通过选择符可以获取到此元素的. 2.ng-if指令 可以根据表达式的值在DOM中生成或移除一个元素.如果赋值给ng-if的表达式的值是false,那对应的元素将会从DOM中移除(DOM中不会存在, 通过选择符无法选择到),否则生成一个新的元素插入DO

angularJS中如何写自定义指令

指令定义 对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能 例如,ng-click可以让一个元素能够监听click事件,并在接收到事件的时候执行angularJS表达式 正是指令使得angularJS这个框架变得强大,并且正如所见,我们可以自己创造新的指令 指令声明方法 angular.module('freefedApp',[]).directive(name,function(){ return { restrict: String, priority: