每当我的表单中的任何非只读输入发生更改且表单有效时,我都会执行某些操作。让我们说,我的表单看起来像
<form name="form" novalidate>
<input ng-model='input.a' required/>
<input ng-model='input.b' required/>
<input value='{{output.p | number: 2}}' readonly/>
<input value='{{output.q | number: 2}}' readonly/>
</form>
现在,input
发生任何变化后,只要input.a
和input.b
有效,我就会做一些事情。我试过了$watch(input)
,但它没有用。看着它的所有成员,但感觉很愚蠢。将ng-change
添加到所有字段感觉更好,但仍然非常愚蠢(非DRY)。什么是正确的方法?
另一个问题是如何确定输入是否有效。如果我有一个按钮,我可以做到
<button ng-click="doIt()" ng-disabled="form.$invalid">
但如何在控制器中访问form.$invalid
($scope
中未包含该内容?)
答案 0 :(得分:3)
您应该可以通过
访问form.$invalid
$scope.form.$invalid
见这里:AngularJs can't access form object in controller ($scope)
要观察表单中的更改,您应该可以:
$scope.$watchCollection('input')
答案 1 :(得分:2)
@dave已经回答了你的第一个问题,但是对于第二个问题,我有一个我认为更优雅的解决方案:
在控制器中,您声明了一个对象,例如:
$scope.forms = {};
然后您的表单名称必须嵌套在该对象中:
<form name="forms.someForm">
...
最后在您的控制器中,您可以执行以下操作:
if($scope.forms.someForm.$invalid) {
...
}