2014-02-13 57 views
0

我自己做了一個自定義指令,它工作正常,但現在我得到了一個表格,其中有一些禁用的字段與ng-disabled,我相信我必須調用setTimeout函數,因爲ng-disabled可能發生後,事實上,但我不知道我編碼正確...是我的代碼正確的方式?我不確定是否有一個特殊位置來放置setTimeout一段代碼,我甚至不確定它實際上是否正確......但它確實似乎起作用......所以有人可以驗證和/或更新我的代碼是否需要?Angular自定義驗證指令 - 如何正確跳過禁用的字段?

// Angular - custom Directive 
directive('myDirective', function($log) { 
    return { 
     require: "ngModel", 
     link: function(scope, elm, attrs, ctrl) { 
      validate = function(value) { 
       ..... 
      } 

      var validator = function(value) { 
       // invalidate field before doing validation 
       ctrl.$setValidity('validation', false); 

       elm.unbind('keyup').bind(keyup, function() { 
        // make the regular validation of the field value 
        var isValid = validate(value); // call validate method   
        scope.$apply(ctrl.$setValidity('validation', isValid));    
       }); 

       // for the case of field that might be ng-disabled, we should skip validation 
       setTimeout(function() { 
        if(elm.attr('disabled')) { 
         ctrl.$setValidity('validation', true); 
        } 
       }, 0); 

       return value;  
      }; 

      // attach the Validator object to the element 
      ctrl.$parsers.unshift(validator); 
      ctrl.$formatters.unshift(validator); 
     } 
    }; 
}); 


編輯
我必須指出,這段代碼是我的代碼一個非常微小的一部分,我只用了它的相關部分,並在是第一次看unbind('keyup')不作很有意義,除非你看到真正的代碼更像unbind('keyup').bind(optionEvnt) ......這實際上是給出了一個額外的可選功能,選擇你想要在驗證器上使用的事件觸發器,並且當我使用blur事件時,默認的鍵盤操作會產生干擾。在許多表單驗證中,我傾向於使用blur事件,這就是爲什麼它是可選功能。
真正的代碼可以在我的Github/Angular-Validation,並提供給大家使用......看看,你可能會喜歡它足以在你的代碼:)

+0

Chen-Tsu Lin ...爲什麼當問題與AngularJS嚴格相關時,你會不斷添加'javascript'標籤?你知道還有其他的方式來獲得分數,然後每天添加標籤... – ghiscoding

回答

3

你似乎有很多不必要的代碼在那裏,除非我錯過了你的實際意圖。這應該工作。

// Angular - custom Directive 
directives.directive('myDirective', function($log) { 
    return { 
     require: "ngModel", 
     link: function(scope, elm, attrs, ctrl) { 

      var validate = function(value) { 
       return (value === "valid"); 
      }; 

      var validator = function(value) { 
       ctrl.$setValidity('validInput', validate(value)); 
       return value; 
      }; 

      // attach the Validator object to the element 
      ctrl.$parsers.unshift(validator); 
      ctrl.$formatters.unshift(validator); 

      // Observe the disabled attribute 
      attrs.$observe("disabled",function(disabled) { 
       if(disabled){ 
        // Turn off validation when disabled 
        ctrl.$setValidity('validation', true); 
       } else { 
        // Re-Validate the input when enabled 
        ctrl.$setValidity('validation', validate(ctrl.$viewValue)); 
       } 
      }); 

     } 
    }; 
}); 
+0

謝謝今晚我會來看看它......'keyup'的東西並不完全是我寫的,我的指令有很多特性,其中一個特性是通過你想要的任何事件觸發器,所以我真正的代碼是'elm.unbind('keyup')。unbind(evnt).bind(evnt,function(){...}'我不得不解除綁定,因爲當我使用另一個綁定時類型的事件我有一個Github提供給每個人,如果你想使用它繼續... https://github.com/ghiscoding/angular-validation – ghiscoding

+0

順便說一句,我願意提出建議和代碼更改Github以及我正處於學習Angular的初期...... thx – ghiscoding

+0

感謝您接受我的回答,現在我可以隨處評論了!(我肯定他們會後悔的)。至於您的項目,它看起來很棒,您是否願意接受要求呢? –

1

使用它,我認爲,如果你使用的角度的$timeout而不是JavaScript的原生setTimeout()你會有更多的運氣,因爲$timeout讓棱角知道發生了什麼,需要更新什麼和所有。不過我認爲最好的解決方案你希望做的是觀察指令的定時器和間隔殘疾人屬性,不需要什麼:

attrs.$observe("disabled",function(value) { 

if(value){ 

     ctrl.$setValidity('validation', true); 

}else{ 

     ctrl.$setValidity('validation', false); 

}}); 
+0

啊是的,我總是忘記,Angular有它自己的'$超時'方法..哈哈...感謝代碼我會在今晚嘗試它後工作。 – ghiscoding