AngularJS 中的 ng-submit:处理表单提交示例

⚡ 智能摘要

AngularJS 中的 ng-submit 将控制器函数绑定到表单的浏览器提交事件,因此输入的值会在控制器内部进行处理,页面永远不会通过默认的 POST 重新加载。

  • 🔘 指令角色: ng-submit 将 AngularJS 表达式绑定到表单元素的提交事件。
  • ☑️ 页面无需重新加载: 除非表单带有 action 属性,否则浏览器默认会抑制 POST 请求。
  • 示例: 文本框加上 Display() 函数会将每个主题推入 AllTopic 数组,以便进行 ng-repeat 循环。
  • 🧪 验证门: 将 $valid 与 novalidate 和 ng-disabled 配对,可以阻止提交不完整的数据。
  • 🛠️ 常见的错误: 在 ng-submit 旁边的提交按钮上绑定 ng-click 会导致重复提交。
  • 📊 版本说明: AngularJS 支持已于 2022 年 1 月结束;现代 Angular 通过 (ngSubmit) 提交。

AngularJS 中的 ng-submit 指令将表单提交事件绑定到控制器函数

AngularJS ng-submit 指令

提交 AngularJS 中的指令用于将应用程序绑定到浏览器的提交事件。因此,在 AngularJS 在提交事件中,您可以在控制器本身内部执行一些处理,然后将处理后的信息显示给用户。

版本说明: AngularJS 1.x 已于 2021 年 12 月 31 日停止长期支持,框架团队确认了这一点。 AngularJS 支持正式结束 此版本于 2022 年 1 月发布,因此不会再发布任何版本或安全补丁。以下每个步骤和代码块均按原样保留,作为历史参考。新的工作应使用现代 Angular,其表达的理念与此相同。 (ngSubmit)绑定到 FormGroup.

如何使用 ng-submit 在 AngularJS 中提交表单

网页上信息提交的过程通常由 Web 浏览器上的提交事件处理。此事件通常用于将用户可能在网页上输入的信息发送到服务器进行进一步处理,如登录凭据、表单数据等。信息提交可以通过 GET 或 POST 请求完成。

让我们以 Angular 表单提交示例来了解如何在 AngularJS 中提交表单。

在我们的 AngularJS 表单提交示例中,我们将向用户显示一个文本框,用户可以在其中输入想要学习的主题。页面上会有一个提交按钮,按下该按钮会将主题添加到无序列表中。

下图 trac从文本框中输入的主题,通过提交按钮,到附加到其下方的列表项,整个过程是流畅的。

包含主题文本框、提交按钮和生成的无序列表主题的 AngularJS 表单
使用 ng-submit 在 AngularJS 中提交表单

AngularJS 表单提交示例

现在,我们将看到一个使用 ng-submit 指令从 Controller 提交 AngularJS 表单的示例:

<!DOCTYPE html>
<html>
<head>

    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>

<body  ng-app="sampleApp">
<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="lib/bootstrap.js"></script>
<script src="lib/bootstrap.css"></script>
<h1> Guru99 Global Event</h1>
<div ng-controller="AngularController">

    <form ng-submit="Display()">
        &nbsp;&nbsp;&nbsp;
        Enter which topic you would like to learn
        <input type="text"  ng-app="sampleApp" ng-model="Topic"><br>

        <input type="submit" value="Submit"/>

        <ul ng-repeat="topicname in AllTopic">
            <li>{{topicname}}</li>
        </ul>
    </form>
</div>

<script>
   var sampleApp = angular.module("sampleApp",[]);

    sampleApp.controller("AngularController",function($scope) {
        $scope.AllTopic=[];
        $scope.Display = function () {
            $scope.AllTopic.push($scope.Topic);
        }
    });
</script>
</body>
</html>

Code 说明:

  1. 首先,我们声明表单的 HTML 标签,它将包含“文本框”和“提交按钮”控件,如 Angular 表单提交事件示例中所示。然后,我们使用 AngularJS 的 ng-submit 指令将“Display()”函数绑定到表单。该函数将在控制器中定义,并在表单提交时调用。
  2. 我们有一个文本控件,用户可以在其中输入他们想要学习的主题。这将绑定到名为“Topic”的变量,该变量将在我们的控制器中使用。
  3. AngularJS 中有一个普通的提交按钮,用户输入他们想要的主题后会点击该按钮。
  4. 我们已经使用了 ng-重复 指令显示用户输入的主题列表项。ng-repeat 指令遍历数组“AllTopic”中的每个主题并相应地显示主题名称。
  5. 在我们的控制器中,我们声明了一个名为“AllTopic”的数组变量。它将用于保存用户在步骤 2 中输入的所有主题。
  6. 我们正在定义 Display() 函数的代码,该函数将在用户单击“提交”按钮时被调用。在这里,我们使用推送数组函数将用户通过变量“Topic”输入的主题添加到我们的数组“AllTopic”中。

如果 AngularJS 表单示例代码成功执行,则在浏览器中运行代码时将显示以下输出。
输出:

AngularJS ng-submit 示例的浏览器输出,显示了空的主题文本框和“提交”按钮。

要查看代码运行,首先在文本框中输入主题名称(如上所示),然后单击“提交”按钮。

点击“提交”按钮后,AngularJS ng-submit 的输出结果会将输入的主题添加到列表中。

  • 单击提交按钮后,您将看到在文本框中输入的项目已添加到项目列表中。
  • 这是通过 Display() 函数实现的,当按下提交按钮时会调用该函数。
  • Display() 函数将文本添加到名为“AllTopic”的数组变量中。我们的 ng-repeat 指令将遍历数组变量“AllTopic”中的每个值,并相应地将它们显示为列表项。

ng-submit 与 ng-click:使用哪一个

以上皆是 AngularJS 指令 可以调用同一个控制器函数,但它们监听的是不同的浏览器事件。 ng-submit 坐在 <form> 它会标记并响应提交事件,因此当用户在字段中按下 Enter 键时,它也会触发。 ng-click 它位于按钮上,仅对鼠标点击或等效激活做出反应。

方面 提交 ng-点击
宿主元素 表单标签 任何可点击元素
活动已收听 提交,包括回车键 仅点击
默认浏览器 POST 被指令压制 仍然会从提交按钮触发
访问表单状态 读取表单控制器中的 $valid 和 $invalid 值 没有自身的任何形式背景
自然贴合 将表单数据传递给控制器 工具栏按钮、链接、模态触发器

键盘支持通常是决定性因素。一种带有键盘的表单 ng-click 单独使用时会忽略回车键,这会让填写登录框的用户感到沮丧。保留 ng-click 对于非表单提交的操作,例如清除字段或打开对话框。

为什么 ng-submit 会阻止浏览器默认提交

一个普通的 HTML 表单在收到提交事件时,会将其字段序列化,并请求浏览器加载一个新页面,该新页面会丢弃表单中保存的所有值。 $scope。 该 ng-submit 指令阻止这种情况发生:它调用 preventDefault() 对你来说,表达式会运行,当前页面保持不变。没有 $event 无需进行参数传递,也无需手动调用。

抑制作用有一个有据可查的条件。根据…… ngSubmit 参考只有当表单不包含任何内容时,才会阻止默认操作。 action, data-action or x-action 属性。添加其中任何一个,处理程序完成后,浏览器都会像往常一样导航,这对于渐进增强型服务器渲染表单来说是正确的行为,但在其他任何地方都会令人意外。

因为该指令会吞噬事件对象,所以需要从属性中读取提交的值。 ng模型 写入作用域,或者显式传递它们,例如: ng-submit="Display(Topic)".

如何在执行 ng-submit 之前验证表单

上面的示例接受空主题,因为没有任何程序会先检查文本框。AngularJS 会为每个命名表单创建一个表单控制器,该控制器会公开用于控制表单提交的标志。添加 novalidate 因此,浏览器会关闭自身的 HTML5 气泡功能,并且 AngularJS 也无法正常工作。 表格验证 接手。

  1. 给表格一个 nameAngularJS 会在周围环境中发布一个同名控制器。 调节器 范围。
  2. 添加 novalidate 将表单标签改为允许原生浏览器验证,这样就不会干扰表单的运行。
  3. 使用以下方式标记字段 required, ng-minlength, ng-maxlength or ng-pattern.
  4. 保护处理者 $valid并将表单控制器传入,以便该函数可以检查各个字段。
  5. 禁用该按钮 ng-disabled 指向 $invalid它可以立即提供视觉反馈。
<form name="topicForm" ng-submit="topicForm.$valid && Display(topicForm)" novalidate>
    <input type="text" name="Topic" ng-model="Topic" required>
    <input type="submit" value="Submit" ng-disabled="topicForm.$invalid">
</form>

该模式中报告的大部分问题都归因于两个错误:

  • Double 提交。 捆绑 ng-click 在提交按钮上 ng-submit 表单上的处理程序会运行两次,每次事件运行一次。官方文档警告不要合并这两个处理程序,所以只能选择其中一个。
  • 意外提交。 表单内的任何按钮 type="button" 触发提交事件。请显式标记取消和重置按钮,否则它们也会触发该事件处理程序。

守卫 $valid 这只是一种便利措施,并非安全控制措施。数值在存储之前仍然需要在服务器上重新验证。

常见问题

是的。当用户在表单的某个字段内按下 Enter 键时,如果该字段包含一个提交类型的输入框或按钮,则会触发提交事件,因此 ng-submit 表达式无需任何额外的按键处理程序即可运行。

不。只有表单元素才会触发指令监听的提交事件。将 ng-submit 移到 form 标签上,或者将 ng-click 附加到你实际想要响应的元素上。

ng-submit 不传递任何参数。读取 ng-model 填充的作用域属性,或者显式地传递它们,例如 ng-submit=”Display(Topic)” 或 ng-submit=”Display(topicForm)”。

是的。每个表单元素都有自己的表单控制器,所以请为每个表单指定一个唯一的名称并绑定一个单独的处理程序。在多个表单之间共享同一个函数会导致作用域冲突。

处理程序无论如何都会触发,但有一个字段没有 ng模型 它从不将值写入 $scope,因此函数无法读取它。请绑定所有计划处理的输入。

在测试中编译表单,在作用域中设置模型值,触发提交事件,然后断言处理程序生成的数组或服务调用。Karma 与 Jasmine 仍然是常用的组合。

语言模型读取模型形状和所需草稿、ng-pattern 和 ng-minlength 属性以及匹配的消息,这使得 AngularJS 的功能更加强大。 表格验证 将其纳入审核步骤。

GitHub 副驾驶 代理模式将模板重写为带有 FormGroup 的 (ngSubmit) 并生成组件类,但生成的验证器和异步调用仍然需要人工审查和测试。

总结一下这篇文章: