【问题标题】:Angular form submitting despite validation error尽管存在验证错误,但仍提交 Angular 表单
【发布时间】:2014-06-30 19:22:32
【问题描述】:

我使用 Angular.js 编写了一个表单,该表单需要在提交之前填写一个字段。验证工作正常(当我提交表单时,该字段显示验证错误)但表单似乎仍在执行其 ng-click 操作。

尽管有验证错误,是否应该提交 Angular 表单?如果出现验证错误,防止其提交的最佳方法是什么?

这是有问题的表格:

<form role="form">
    <div class="form-group">
        <label>Book Id</label><br> 
        <input ng-model="bookToSend.bookId" class="form-control" maxlength="40" required type="text">
    </div>
    <button type="submit" ng-click="sendBookUpdate(BookToSend)">Send Book Update</button>
</form>

【问题讨论】:

    标签: javascript forms angularjs validation


    【解决方案1】:

    当出现验证错误时,Angular 不会阻止表单提交。

    实际上使用您粘贴的 sn-p,显示错误只是因为默认情况下,html5 提供了错误验证。

    您应该查看文档:https://docs.angularjs.org/guide/forms

    基本上你必须为你的表单命名:

    <form name="myForm" role="form">
    

    然后你可以阻止你的表单在你的控制器中提交:

    $scope.sendBookUpdate(BookToSend, form) {
      if (form.$invalid) {
        return; // and add any error to the view if you want
      }
    
      ...
    }
    

    另一种选择是阻止从视图提交:

    <form name="myForm" role="form" ng-submit="myForm.$valid && sendBookUpdate(BookToSend)">
    

    【讨论】:

    • 我阻止它从视图中提交。谢谢!
    【解决方案2】:

    您可以禁用按钮,直到表单具有有效数据

    <button type="submit" data-ng-disabled="form.$invalid">Send Book Update</button>
    

    【讨论】:

    • 正如 Diego 指出的那样,表单的名称是必需的(并且该名称必须在您的 ng-disabled 中引用)。此外,我更喜欢显示验证错误而不是禁用按钮,因为这会使解决方案对用户更加明确。
    • 我的错。我不知何故认为“形式”是名称,没想到“角色”属性。我通常禁用按钮并在每个字段发生错误时显示错误。
    【解决方案3】:

    编辑:

    当我在下面写答案时,我假设 ngClick 与 Angular 使用的任何表单提交处理程序完全分开。但是,我错了,如下面的 cmets 所示。尽管这个答案不准确,但我会保持这个答案,以告知那些与我有同样误解的人,因为至少对我来说,将 ng-click 双重作为提交处理程序有点违反直觉.


    ng-click 独立于表单的提交处理程序,每次单击按钮时都会运行,无论它是否通过验证检查。

    您的问题的解决方案是使用 sendBookUpdate(BookToSend),并将其放在表单本身的 ng-submit 属性中。请看下面的代码:

    <form role="form" ng-submit="sendBookUpdate(BookToSend)">
        <div class="form-group">
            <label>Book Id</label><br> 
            <input ng-model="bookToSend.bookId" class="form-control" maxlength="40" required type="text">
        </div>
        <button type="submit">Send Book Update</button>
    </form>
    

    如果有帮助,请告诉我。

    编辑:

    这里有一些关于 ngSubmit 的更多信息:

    https://docs.angularjs.org/api/ng/directive/ngSubmit

    【讨论】:

    • 实际上,我设置的 ng-click 应该根据angular form docs 工作。它是表单中唯一的 submit 类型的 input 元素。
    • 太棒了。谢谢你教我一些东西!但这似乎不违反直觉吗?无论如何,我会留下我的答案,以防出现与我有相同(错误)理解的人。
    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2017-11-08
    • 2023-03-25
    相关资源
    最近更新 更多