AngularJs 指令directive之require

controller的用法分为两种情形,一种是require自定义的controller,因为自定义controller中的属性方法都由本身编 写,使用起来比较简单;另外一种方法则是require AngularJS内建的指令,其中大部分时间须要require的都是ngModel这个指令。html

在自定义Angular指令时,其中有一个叫作require的字段,这个字段的做用是用于指令之间的相互交流。举个简单的例子,假如咱们如今须要编写两 个指令,在linking函数中有不少重合的方法,为了不重复本身(著名的DRY原则),咱们能够将这个重复的方法写在第三个指令的 controller中,而后在另外两个须要的指令中require这个拥有controller字段的指令,最后经过linking函数的第四个参数就能够引用这些重合的方法。代码的结构大体以下:angularjs

Java代码   收藏代码
  1. var app = angular.modeule('myapp',[]);  
  2.   
  3. app.directive('common',function(){  
  4.     return {  
  5.     ...  
  6.     controller: function($scope){  
  7.         this.method1 = function(){  
  8.         };  
  9.         this.method2 = function(){  
  10.         };  
  11.     },  
  12.     ...  
  13.     }  
  14. });  
  15.   
  16. app.directive('d1',function(){  
  17.     return {  
  18.     ...  
  19.     require: '?^common',  
  20.     link: function(scope,elem,attrs,common){  
  21.         scope.method1 = common.method1;  
  22.         ..  
  23.         },  
  24.     ...  
  25.     }  
  26. });  

固然,上面例子只是指令中controller用法的一种。虽然通常来讲,使用controller字段的机会不是不少,可是想要写好AngularJS的指令,这是必需要掌握的一点。api

 

引用内置指令浏览器

Java代码   收藏代码
  1. angular.module('myApp')  
  2. .directive('spoint', function() {  
  3.   return {  
  4.     require: 'ngModel',  
  5.     link: function(scope, elm, attrs, ctrl) {  
  6.       var fibonacci = [1, 2, 3, 5, 8, 13, 20, 40, 80];  
  7.       ctrl.$parsers.unshift(function(viewValue) {  
  8.         if (fibonacci.indexOf(parseInt(viewValue)) >= 0) {  
  9.           ctrl.$setValidity('fibonacci', true);  
  10.           return viewValue;  
  11.         } else {  
  12.           ctrl.$setValidity('fibonacci', false);  
  13.           return undefined;  
  14.         }  
  15.       });  
  16.     }  
  17.   };  
  18. });  

这里值得注意的是directive里link方法的第四个参数,咱们在require里定义了ngModel 因此这里它是一个NgModelControllerapp

NgModelController是用来为ng-model提供了一组API。经过他咱们能够他来肯定ngModel的 值是不是合法的。 咱们这里只介绍其中和表单验证有关的几个方法和属性。函数

上面的例子中咱们用到了$parsers这个属性和$setValidity()这个方法。 $parsers里保存了一组function, 每当DOM里数据变化的时候, 这组function会被一次调用。这里给了咱们机会在用户修改了DOM里值的时候, 去对新输入的值作校验。ui

 

“智能浮点(smart-float)”指令。它能把"1.2"或者"1,2"都转化为合法的浮点数"1.2"。注意,这里咱们不能使用“数字输入类型”,由于HTML5的浏览器不容许用户输入像"1,2"这样的非法值。this

htmlspa

Java代码   收藏代码
  1. <input type="text" ng-model="length" name="length" smart-float />  
  2. {{length}}<br />  
  3. <span ng-show="form.length.$error.float">This is not a valid float number!</span>  

 jsorm

Java代码   收藏代码
  1. var FLOAT_REGEXP = /^\-?\d+((\.|\,)\d+)?$/;  
  2. app.directive('smartFloat', function() {  
  3.   return {  
  4.     require: 'ngModel',  
  5.     link: function(scope, elm, attrs, ctrl) {  
  6.       ctrl.$parsers.unshift(function(viewValue) {  
  7.         if (FLOAT_REGEXP.test(viewValue)) {  
  8.           ctrl.$setValidity('float', true);  
  9.           return parseFloat(viewValue.replace(',', '.'));  
  10.         } else {  
  11.           ctrl.$setValidity('float', false);  
  12.           return undefined;  
  13.         }  
  14.       });  
  15.     }  
  16.   };  
  17. });  
相关文章
相关标签/搜索