2016-07-13 31 views
0

我下载了一个指令,只接收数字,并有一些额外的选项;但是,它运行后,我收到了rootScope错误的认为是其中一个选项:

<input type="text" ng-model="mynumber" nks-only-number allow-decimal="false" /> 

我相信假条件是使这个错误出现,但我不知道为什么。

以下是演示: http://jsfiddle.net/RmDuw/896/

代码:

(function(){ 
    angular.module('myApp', []) 
     .directive('nksOnlyNumber', function() { 
     return { 
      restrict: 'EA', 
      require: 'ngModel', 
      link: function (scope, element, attrs, ngModel) { 
       scope.$watch(attrs.ngModel, function(newValue, oldValue) { 
        var spiltArray = String(newValue).split(""); 

        if(attrs.allowNegative == "false") { 
        if(spiltArray[0] == '-') { 
         newValue = newValue.replace("-", ""); 
         ngModel.$setViewValue(newValue); 
         ngModel.$render(); 
        } 
        } 

        if(attrs.allowDecimal == "false") { 
         newValue = parseInt(newValue); 
         ngModel.$setViewValue(newValue); 
         ngModel.$render(); 
        } 

        if(attrs.allowDecimal != "false") { 
        if(attrs.decimalUpto) { 
         var n = String(newValue).split("."); 
         if(n[1]) { 
          var n2 = n[1].slice(0, attrs.decimalUpto); 
          newValue = [n[0], n2].join("."); 
          ngModel.$setViewValue(newValue); 
          ngModel.$render(); 
         } 
        } 
        } 


        if (spiltArray.length === 0) return; 
        if (spiltArray.length === 1 && (spiltArray[0] == '-' || spiltArray[0] === '.')) return; 
        if (spiltArray.length === 2 && newValue === '-.') return; 

        /*Check it is number or not.*/ 
        if (isNaN(newValue)) { 
         ngModel.$setViewValue(oldValue || ''); 
         ngModel.$render(); 
        } 
       }); 
      } 
     }; 
    }); 
}()); 
+0

您的JSFiddle与您在这里发布的代码不太相似......这是正确的吗? – Sam

+0

是一样的,我刚刚在这里显示代码directlly – Pedro

回答

0

我相信问题,看你粘贴代码(而不是不同的jsfiddle),是ngModel.$render()被调用两次。如果我从attrs.allowDecimal == false条件或结尾isNaN(newValue)有条件删除它,代码运行良好。

因为我不确定你的最终目标是什么,所以我忽视了实际重写你的代码。但是,这解决了infinite $digest loop错误。

+0

对不起,是错误jsfidlle,对不起, – Pedro

+0

我已经尝试过,仍然给我的错误,你可以检查这个链接我更新以上:http://jsfiddle.net/RmDuw/896/ – Pedro

+0

@ MBPP不用担心。如果你[在最后删除了所有'splitArray'和'isNaN(newValue)'东西](http://jsfiddle.net/RmDuw/898/),它工作正常。不知道这是否有很好的用处(乍一看似乎是重复的,但我可能会错过某些东西)...... – Sam