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. });  
相關文章
相關標籤/搜索