2017-07-04 51 views
1

我試圖驗證自定義輸入框,下面AngularJS輸入與數字得到了一個未定義當超出範圍

<div class="form-group"> 
<label for="inputNetwork" class="control-label">{{'DNS_PRIMARY' | translate}}</label> 
<div class="control-content"> 
    <p> 
     <input type="number" integer min="1" max="223" 
      class="ip-single-column" ng-model="network.dnsPrimary[0]" name="dnsP0" required ng-blur="dnsBlur('P', 0)" 
      ng-class="{'has-error': networkForm.dnsP0.$invalid}" validate-dns>. 
     <input type="number" integer min="0" max="255" 
      class="ip-single-column" ng-model="network.dnsPrimary[1]" name="dnsP1" required ng-blur="dnsBlur('P', 1)" 
      ng-class="{'has-error': networkForm.dnsP1.$invalid}" validate-dns>. 
     <input type="number" integer min="0" max="255" 
      class="ip-single-column" ng-model="network.dnsPrimary[2]" name="dnsP2" required ng-blur="dnsBlur('P', 2)" 
      ng-class="{'has-error': networkForm.dnsP2.$invalid}" validate-dns>. 
     <input type="number" integer min="0" max="254" 
      class="ip-single-column" ng-model="network.dnsPrimary[3]" name="dnsP3" required ng-blur="dnsBlur('P', 3)" 
      ng-class="{'has-error': networkForm.dnsP3.$invalid}" validate-dns> 
    </p> 
</div> 

 $scope.dnsBlur= function(section, pos) { 

     var elem = $scope.network.dnsPrimary; 
     var i = pos; 
     if(section.endsWith('P')) { 
      // primary 
      switch(i) { 
       case 0: 
        if (angular.isUndefined(elem[i]) || (elem[i] < 1 && elem[i] > 223)) 
         elem[i] = $scope.defaultDns[i]; 
        break; 
       case 1: 
        // if (!elem[i] || (elem[i] < 0 && elem[i] > 254)) 
        if (angular.isUndefined(elem[i]) || (elem[i] < 0 && elem[i] > 254)) 
         elem[i] = $scope.defaultDns[i]; 
        break; 
       case 2: 
        if (angular.isUndefined(elem[i]) || (elem[i] < 0 && elem[i] > 255)) 
         elem[i] = $scope.defaultDns[i]; 
        break; 
       case 3: 
        if (angular.isUndefined(elem[i]) || (elem[i] < 0 && elem[i] > 254)) 
         elem[i] = $scope.defaultDns[i]; 
        break; 
      } 
     } 
    } 




}]).directive('validateDns', ['$rootScope', 
function($rootScope) { 
    function link($scope, elem, attrs, c) { 
     $scope.$watch(attrs.ngModel, function(newValue, oldValue) { 
      c.$setValidity('outOfRange', true); 


      switch(c.$name.charAt(c.$name.length - 1)) { 
       case 0: 
        if (!$scope.network.dnsPrimary[i] || ($scope.network.dnsPrimary[i] < 1 && $scope.network.dnsPrimary[i] > 223)) 
         c.$setValidity('outOfRange', false); 
        break; 
       case 1: 
        if (!$scope.network.dnsPrimary[i] || ($scope.network.dnsPrimary[i] < 0 && $scope.network.dnsPrimary[i] > 255)) 
         c.$setValidity('outOfRange', false); 
        break; 
       case 2: 
        if (!$scope.network.dnsPrimary[i] || ($scope.network.dnsPrimary[i] < 0 && $scope.network.dnsPrimary[i] > 255)) 
         c.$setValidity('outOfRange', false); 
        break; 
       case 3: 
        if (!$scope.network.dnsPrimary[i] || ($scope.network.dnsPrimary[i] < 0 && $scope.network.dnsPrimary[i] > 254)) 
         c.$setValidity('outOfRange', false); 
        break; 
      } 

     }); 
    } 
    return { 
     require: 'ngModel', 
     link: link 
    }; 
} 

但是,當我試圖讓模糊輸入號碼()函數。

輸入輸出或範圍時,它會變得不確定。例如,輸入999但未定義。 無論如何在Blur()中獲得999?

+1

'validate-ip'是你寫的指令嗎?你可以添加它,所以我們可以看到它做了什麼? –

回答

1

您在模糊或其他裝飾器中存在問題。即使超出指定範圍,字段的值也應該是實際值。

<form action="#" onsubmit="console.log(this.quantity.value);return false;"> 
 
    Quantity: 
 
    <input type="number" name="quantity" 
 
    min="0" max="100" step="10" value="30" onblur="console.log(this.value);"> 
 
    <input type="submit"> 
 
</form>

+0

更新我原來的questino片段。我嘗試了你的代碼,它的工作原理。當我添加'onblur = console.log(this.value)'它也適用於我的代碼。但是當我改變它ng模糊它不起作用。即使我將'network.dnsPrimary [i]'添加到dnsBlur函數中。 –

+0

我的猜測是驗證函數使輸入值對ng指令無效。 – bluehipy

+0

我會去驗證每個字段'validate-dns-segment',並驗證每個模型在所有段上都有效。 – bluehipy

相關問題