天天看點

AngularJs 指令directive之require

在自定義angular指令時,其中有一個叫做require的字段,這個字段的作用是用于指令之間的互相交流。舉個簡單的例子,假如我們現在需要編寫兩 個指令,在linking函數中有很多重合的方法,為了避免重複自己(著名的dry原則),我們可以将這個重複的方法寫在第三個指令的 controller中,然後在另外兩個需要的指令中require這個擁有controller字段的指令,最後通過linking函數的第四個參數就可以引用這些重合的方法。代碼的結構大緻如下:

AngularJs 指令directive之require

var app = angular.modeule('myapp',[]);  

app.directive('common',function(){  

    return {  

    ...  

    controller: function($scope){  

        this.method1 = function(){  

        };  

        this.method2 = function(){  

    },  

    }  

});  

app.directive('d1',function(){  

    require: '?^common',  

    link: function(scope,elem,attrs,common){  

        scope.method1 = common.method1;  

        ..  

        },  

當然,上面例子隻是指令中controller用法的一種。雖然一般來說,使用controller字段的機會不是很多,但是想要寫好angularjs的指令,這是必須要掌握的一點。

引用内置指令

AngularJs 指令directive之require

angular.module('myapp')  

.directive('spoint', function() {  

  return {  

    require: 'ngmodel',  

    link: function(scope, elm, attrs, ctrl) {  

      var fibonacci = [1, 2, 3, 5, 8, 13, 20, 40, 80];  

      ctrl.$parsers.unshift(function(viewvalue) {  

        if (fibonacci.indexof(parseint(viewvalue)) >= 0) {  

          ctrl.$setvalidity('fibonacci', true);  

          return viewvalue;  

        } else {  

          ctrl.$setvalidity('fibonacci', false);  

          return undefined;  

        }  

      });  

  };  

ngmodelcontroller是用來為ng-model提供了一組api。通過他我們可以他來确定ngmodel的 值是否是合法的。 我們這裡隻介紹其中和表單驗證有關的幾個方法和屬性。

上面的例子中我們用到了$parsers這個屬性和$setvalidity()這個方法。 $parsers裡儲存了一組function, 每當dom裡資料變化的時候, 這組function會被一次調用。這裡給了我們機會在使用者修改了dom裡值的時候, 去對新輸入的值做校驗。

“智能浮點(smart-float)”指令。它能把"1.2"或者"1,2"都轉化為合法的浮點數"1.2"。注意,這裡我們不能使用“數字輸入類型”,因為html5的浏覽器不允許使用者輸入像"1,2"這樣的非法值。

html

AngularJs 指令directive之require

<input type="text" ng-model="length" name="length" smart-float />  

{{length}}<br />  

<span ng-show="form.length.$error.float">this is not a valid float number!</span>  

 js

AngularJs 指令directive之require

var float_regexp = /^\-?\d+((\.|\,)\d+)?$/;  

app.directive('smartfloat', function() {  

        if (float_regexp.test(viewvalue)) {  

          ctrl.$setvalidity('float', true);  

          return parsefloat(viewvalue.replace(',', '.'));  

          ctrl.$setvalidity('float', false);