我正在使用ng-pattern来验证某些表单字段,我正在使用ng-change来监视和处理任何更改,但是ng-change(或$ scope。$ watch)只会在表单元素时触发处于$有效状态!我是棱角分明的,所以我不知道如何解决这个问题,虽然我怀疑新的指令是要走的路。
如何在$ invalid和$ valid表单元素状态下触发ng-change,而ng-pattern仍然像以前一样设置表单元素状态?
HTML:
<div ng-app="test">
<div ng-controller="controller">
<form name="form">
<input type="text" name="textbox" ng-pattern="/^[0-9]+$/" ng-change="change()" ng-model="inputtext"> Changes: {{ changes }}
</form>
<br>
Type in any amount of numbers, and changes should increment.
<br><br>
Now enter anything that isn't a number, and changes will stop incrementing. When the form is in the $invalid state, ng-change doesn't fire.
<br><br>
Now remove all characters that aren't numbers. It will increment like normal again. When the form is in the $valid state, ng-change will fire.
<br><br>
I would like ng-change to fire even when the the form is $invalid.
<br><br>
form.$valid: <font color="red">{{ form.$valid }}</font>
</div>
</div>
使用Javascript:
angular.module('test', []).controller('controller', function ($scope) {
$scope.changes = 0;
$scope.change = function () {
$scope.changes += 1;
};
});
我创建了一个工作的JS Fiddle,它显示了我遇到的问题。
顺便说一句,这个角度问题似乎也很重要: https://github.com/angular/angular.js/issues/1296
答案 0 :(得分:70)
您可以使用ng-model-options更改输入的行为。
只需将此属性添加到您的输入中,即可触发ng-change事件:
ng-model-options="{allowInvalid: true}"
请参阅:https://docs.angularjs.org/api/ng/directive/ngModelOptions
答案 1 :(得分:14)
你只需要添加
ng-model-options="{ updateOn: 'default' , allowInvalid:'true'}"
这表示可以使用未正确验证的值而不是默认行为来设置模型。
答案 2 :(得分:5)
修改 ng-model-options
无效时已回答此问题。请参阅最高投票的答案。
你可以编写一个简单的指令来监听input
事件。
HTML:
<input type="text" name="textbox" ng-pattern="/^[0-9]+$/" watch-change="change()" ng-model="inputtext"> Changes: {{ changes }}
JS:
app.directive('watchChange', function() {
return {
scope: {
onchange: '&watchChange'
},
link: function(scope, element, attrs) {
element.on('input', function() {
scope.$apply(function () {
scope.onchange();
});
});
}
};
});
答案 3 :(得分:4)
受到李银孔巧妙解决方案的启发:
他的解决方案有关于ndModel更新的问题(请参阅他的帖子的评论)。
我的修复本质上改变了指令的范围类型。它允许指令访问控制器范围(和方法)
然后,watch-change
指令不再需要“eval指令”(change()
),而只需要“要调用的控制器方法的名称”(change
)。
为了获得此函数中输入的新值,我传递了上下文(this =输入本身)。所以我可以得到它的价值或任何属性。
这样,我们不关心ngModel更新(或者如果表单无效,这是初始解决方案的另一个问题:如果表单无效则删除ngModel)
HTML:
<input type="text" name="textbox" ng-pattern="/^[0-9]+$/" watch-change="change" ng-model="inputtext">
JAVASCRIPT:
app.directive('watchChange', function() {
return {
restrict : 'A',
link: function(scope, element, attrs) {
element.on('input', function(){
scope[attrs.watchChange](this);
})
}
};
});