【问题标题】:Why binding to null not work when value of number input illegal in AngularJs当AngularJs中的数字输入值非法时,为什么绑定到null不起作用
【发布时间】:2016-11-06 23:32:06
【问题描述】:

在此处查看示例:https://jsfiddle.net/codefalling/u2mn764x/1/

<div ng-app>
  <div ng-controller="TodoCtrl">
      <input type="number" ng-model="value"  size="30" >
      <input type="button" ng-click="change()" class="btn-primary" value="TEST" >
  </div>
</div>

function TodoCtrl($scope) {
  $scope.change = function() {
    $scope.value = null
  }
}

当我在数字输入中输入10时,点击按钮,它变成了空。

但是,当我在数字输入中键入独立的 e.,然后单击按钮时,没有任何反应。但是$scope.value = 123仍然有效。

那么,为什么在这种情况下视图没有得到更新(空)

补充一下,还有什么办法可以清空吗?

【问题讨论】:

  • @varit05 这不是答案。我的问题不是为什么可以输入e,而是当我将$scope.value 设置为null 并使用独立e 等非法输入时,为什么角度没有更新视图
  • 当您输入 e 或 .它仍然不完整并且不代表控件的有效值,并且看起来浏览器甚至不会将此值提供给您的控件。看看这个更新的小提琴jsfiddle.net/u2mn764x/2
  • 当你输入.时,模型已经是null
  • @zeroflagL 你明白了!那么我应该通过 DOM API 清空非法输入吗?

标签: javascript angularjs web frontend


【解决方案1】:

感谢@zeroflagL 的评论。我找到了答案。

输入非法时模型没有值。所以$scope.value = null$scope.value = '' 不起作用,因为它们也是非法值。

模型值和视图值都未定义,因此 angular 没有更新视图。

我们可以使用 DOM API 手动清空非法输入。或者将 modal 设置为一个值,强制进行脏检查,然后再次将其设置为 null

$scope.value = 0
$scope.$apply();
$scope.value = null

https://jsfiddle.net/codefalling/xhcz3Lbj/

【讨论】:

    【解决方案2】:

    要清除 HTML 5 数字控件,您可以检查控件的状态,如果它无效,则将其值覆盖为空白。我已经用下面的代码更新了你的小提琴https://jsfiddle.net/u2mn764x/3/

    <div ng-app>
      <div ng-controller="TodoCtrl">
          <input type="number" ng-model="value"  size="30" id='mynumber'>
          <input type="button" ng-click="change()" class="btn-primary" value="TEST" >
      </div>
    </div>
    
    function TodoCtrl($scope) {
      $scope.change = function() {
        if (!document.getElementById('mynumber').validity.valid)
        {
            $scope.value = null
          document.getElementById('mynumber').value='';
        }
    
      }
    }
    

    【讨论】:

      【解决方案3】:

      只要你在数字输入中输入 10,Angular 就会绑定 10,它就像 $scope.value = 10,但是当你触发点击事件时,你正在将值更改为 null,比如 $scope.value = null ,所以通过事件发送模型的值并将其绑定到您的变量。

      <div ng-app>
      <div ng-controller="TodoCtrl">
        <input type="number" ng-model="value"  size="30" >
        <input type="button" ng-click="change($event,value)" class="btn-primary" value="TEST" >
      </div>
      </div>
      

      还有 javascript 代码:

      function TodoCtrl($scope) {
         $scope.change = function($event,val) {
         $scope.value = val;
          }
       }
      

      【讨论】:

        【解决方案4】:

        简而言之,因为e. 不是完整的合法数值。根据Foalting point number in W3 spec

        • 如果值以.开头,后面必须跟一个或多个“0—9”;
        • 如果值以e开头,后面必须跟可选的+-,以及一个或多个“0-9”

        由于HTML检查没有通过,所以不会触发JS,和我想象的一样。如果继续输入.1e45,就可以了。

        【讨论】:

        • 我知道它们是非法的。但是为什么将$scope.value = null 更改为$scope.value = 123 有效?
        • 我不知道,但null 也不是合法输入。您可以使用$scope.value = '123' 进行测试,它的功能与$scope.value = null 完全相同。
        • $scope.value = '123' 只需将值更改为 123。那我如何清空这个数字输入框呢?
        • 顺便说一句,当输入中有非法数字如223时,$scope.value = null也清空。
        • 看到这个答案:stackoverflow.com/a/18853513/1165178,“如果元素的值不是有效的浮点数,则将其设置为空字符串。”
        猜你喜欢
        • 1970-01-01
        • 2014-05-31
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        • 1970-01-01
        • 2020-12-22
        • 2015-03-21
        • 1970-01-01
        相关资源
        最近更新 更多