示例如下: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
仍然有效。
那么,为什么在这种情况下视图没有得到update(empty) ?
另外,还有其他清空的方法吗?
要清除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='';
}
}
}
简而言之,因为e
和.
不是完整的合法数值。根据W3规范中的倒衬点编号:
- 如果值以
.
开头,必须后跟一个或多个"0-9"; - 如果以
e
开头,后面必须跟着可选的+
或-
,以及一个或多个"0-9"
由于HTML检查没有通过,所以它不会触发JS,正如我想象的那样。如果您继续输入.1
或e45
,它可以工作
只要你在Number Input中输入10,Angular就会绑定10,它就像$scope一样。Value = 10,但是当您触发click事件时,您将值更改为null,如$scope。Value = null,因此通过事件发送model的值并将其绑定到变量。
<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;
}
}
感谢@zeroflagL的评论。我找到了答案。
当输入非法时,模型没有值。所以$scope.value = null
或$scope.value = ''
不能工作,因为它们也是非法值。
模型值和视图值都是未定义的,所以angular没有更新视图。
我们可以使用DOM API手动清空非法输入。或者将modal设置为一个值,强制dirty检查,然后再次将其设置为null :
$scope.value = 0
$scope.$apply();
$scope.value = null
见https://jsfiddle.net/codefalling/xhcz3Lbj/