【问题标题】:Form change and validity in angularjsangularjs中的表单更改和有效性
【发布时间】:2014-05-06 21:19:42
【问题描述】:

每当我的表单中的任何非只读输入发生更改并且表单有效时,我都会执行某些操作。比方说,我的表单看起来像

<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.ainput.b 有效,只要input 发生任何变化,我就想做点什么。我试过$watch(input),但没有用。看着它的所有成员确实如此,但感觉很愚蠢。将ng-change 添加到所有字段感觉更好,但仍然非常愚蠢(非 DRY)。正确的方法是什么?


另一个问题是如何确定输入是否有效。如果我有一个按钮,我可以做的很简单

<button ng-click="doIt()" ng-disabled="form.$invalid">

但是如何在控制器中访问form.$invalid(它不包含在$scope 中)?

【问题讨论】:

    标签: javascript angularjs forms angularjs-validation


    【解决方案1】:

    您应该可以通过以下方式访问form.$invalid

    $scope.form.$invalid
    

    请看这里:AngularJs can't access form object in controller ($scope)

    要观察表单的变化,您应该能够:

    $scope.$watchCollection('input')
    

    【讨论】:

    • 两者都有效,非常感谢。但根据你的链接,它应该对我有用,没有任何setFormScope(我没有做$modal.open,不是这样的;只是一个带有基本ctrl的基本页面),但它没有。有什么想法吗?
    【解决方案2】:

    @dave 已经回答了您的第一个问题,但对于第二个问题,我有一个我认为更优雅的解决方案:

    在你的控制器中你已经声明了一个对象,例如:

    $scope.forms = {};
    

    那么你的表单名必须嵌套在那个对象里面:

    <form name="forms.someForm">
        ...
    

    最后在你的控制器中你可以做这样的事情:

    if($scope.forms.someForm.$invalid) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2016-03-18
      相关资源
      最近更新 更多