2014-04-23 27 views
7
<div ng-app=""> 
<div ng-controller="MyCtrl"> 
    <input required type="number" ng-model="teams.length" min="1" max="9">  
    <span>pressing backspace to remove the number causes an exception</span> 

    <div ng-repeat="team in teams track by $index"> 
     team {{$index+1}} 
    </div> 
</div> 

的RangeError當結合輸入array.length輸入

function MyCtrl($scope) { 
    $scope.teams = [{}]; 
} 

按Backspace鍵導致異常:

RangeError: Invalid array length 
at setter (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:9982:12) 
at token.fn.extend.assign (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:9429:18) 
at $setViewValue (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:16390:7) 
at http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:15654:14 
at Scope.$eval (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:11576:28) 
at Scope.$apply (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:11676:23) 
at HTMLInputElement.listener (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:15653:13) 
at http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:2562:10 
at Array.forEach (native) 
at forEach (http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.js:300:11) 

我想什麼,而不是發生是輸入到失敗認證(ng-invalid)。 我跑角1.2.16

JSFiddle

回答

5

不要直接teams.length綁定;而是創建一個新變量,如length,並綁定到它。然後$watch它並將更改應用於teams.length(如果適用)。使輸入ng-required="true"

<input ng-required="true" type="number" ng-model="length" min="1" max="9" /> 

和:

function MyCtrl($scope) { 
    $scope.teams = [{}]; 
    $scope.length = $scope.teams.length; 

    $scope.$watch("length", function(newlength) { 
     if(newlength) { 
      $scope.teams.length = newlength; 
     } 
    }); 
} 

小提琴:http://jsfiddle.net/6pcVN/

+0

感謝。順便說一句,在這種情況下,您選擇ng-required =「true」而不是簡單地「required」是否有特定的原因? –

+0

你說得對,'required'具有相同的效果;我更喜歡'ng-required'是安全的,但在這種情況下它是多餘的。 –