2014-02-05 90 views
0

我使用下面的指令驗證輸入元素。問題在於,這種方式只有在輸入元素被激活時纔會執行。有沒有辦法強制執行表單的所有輸入元素的解析器方法?強制驗證提交

"use strict"; 

angular.module("kap.directive") 
    .directive('kapValidationDuration', ['$timeout', '$log', function ($timeout, $log) { 
     return { 
      restrict: 'A', 
      require: 'ngModel', 
      scope: { minReservationDurationMinutes: '=minReservationDurationMinutes' }, 
      link: function (scope, element, attrs, ctrl) { 
       if (attrs.type === 'radio' || attrs.type === 'checkbox') { 
        return; 
       } 

       ctrl.$parsers.push(function (value) { 
        if(value && !element[0].hidden) { 

         var lTimeValues = value.split(":"), 
         lHoursToMinutes = parseInt(lTimeValues[0], 10) * 60, 
         lMinutes = parseInt(lTimeValues[1], 10), 
         lMinReservationDurationMinutes = parseInt(attrs.minreservationdurationminutes, 10) || 10, 
         lValidity = true; 


        if ((lHoursToMinutes + lMinutes) < lMinReservationDurationMinutes) { 
         lValidity = false; 
        } 

        ctrl.$setValidity('kapValidationDuration', lValidity); 
        } 

        return value; 
       }); 
      } 
     }; 
    }]); 

回答

1

爲了做到這一點,即驗證初始值,還必須使用$formatters。 Luckilly,在你的情況下,你只需要unshift相同的功能$formatters,作爲$parsers使用的一個。

原因是解析器用於→模型時。一般來說,這意味着數據轉換:如果模型是一個數字,那麼來自用戶的輸入總是一個字符串並且必須被轉換;錯誤不僅可以是有效的(例如「年齡必須是正面的」),而且也可以是解析(例如「'塔塔'不是有效的數字」)。格式化程序去模型→的形式。顧名思義,這是格式化的:例如一個Date對象可能需要在我的語言環境(希臘語)中顯示爲dd/MM/yyyy,但在其他語言環境中則顯示爲MM/dd/yyyy

看到這個小提琴:http://jsfiddle.net/52dAB/

在我仍在使用的格式化和解析器兩個單獨的函數的小提琴,儘管他們是在執行相同的。只是爲了一般性。