AngularJS:与服务器端验证集成

2023-12-13

我有一个有角度的应用程序,其中包含一个取自示例的保存按钮:

<button ng-click="save" ng-disabled="form.$invalid">SAVE</button>

这对于客户端验证非常有用,因为form.$invalid当用户修复问题时变为 false,但我有一个电子邮件字段,如果另一个用户使用同一电子邮件注册,该字段将设置为无效。

一旦我将电子邮件字段设置为无效,我就无法提交表单,并且用户无法修复该验证错误。所以现在我不能再使用form.$invalid禁用我的提交按钮。

一定会有更好的办法


这是自定义指令成为您朋友的另一种情况。您需要创建一个指令并将 $http 或 $resource 注入其中,以便在验证时回调服务器。

自定义指令的一些伪代码:

app.directive('uniqueEmail', function($http) {
  var toId;
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, elem, attr, ctrl) { 
      //when the scope changes, check the email.
      scope.$watch(attr.ngModel, function(value) {
        // if there was a previous attempt, stop it.
        if(toId) clearTimeout(toId);

        // start a new attempt with a delay to keep it from
        // getting too "chatty".
        toId = setTimeout(function(){
          // call to some API that returns { isValid: true } or { isValid: false }
          $http.get('/Is/My/EmailValid?email=' + value).success(function(data) {

              //set the validity of the field
              ctrl.$setValidity('uniqueEmail', data.isValid);
          });
        }, 200);
      })
    }
  }
});

以下是在标记中使用它的方法:

<input type="email" ng-model="userEmail" name="userEmail" required unique-email/>
<span ng-show="myFormName.userEmail.$error.uniqueEmail">Email is not unique.</span>

编辑:对上面发生的事情的一个小解释。

  1. 当您更新输入中的值时,它会更新 $scope.userEmail
  2. The directive has a $watch on $scope.userEmail it set up in it's linking function.
    • 当 $watch 被触发时,它会通过 $http ajax 调用来调用服务器,并传递电子邮件
    • 服务器将检查电子邮件地址并返回一个简单的响应,例如 '{ isValid: true }
    • 该响应用于控件的 $setValidity 。
  3. 标记中有一个 ng-show 设置为仅在 uniqueEmail 有效性状态为 false 时显示。

...对于用户来说这意味着:

  1. 输入电子邮件。
  2. 轻微的停顿。
  3. 如果电子邮件不唯一,“电子邮件不唯一”消息将显示“实时”。

EDIT2:这也允许您使用 form.$invalid 禁用提交按钮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS:与服务器端验证集成 的相关文章

  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 确定 C 字符串是否是 C 中的有效 int

    我需要检查 C 字符串是否是有效整数 我都尝试过 int num atoi str and int res sscanf str d num 但发送字符串 8 9 10 这两行都仅返回 8 而没有指示该字符串的无效性 谁能提出替代方案 看看
  • 如何使用 ng-repeat 更改 AngularJS 中特定 的背景颜色

    如何为每一行设置不同的背景颜色 举个例子 第 1 行 蓝色 第2行 红色 第三行 绿色 main js scope names fName John lName David fName Richard lName Daniel fName
  • HTML5 URL 模式下 AngularJS 的 Flask 路由

    我有一个通过 Flask 提供服务的 AngularJS 应用程序 我使用的是 HTML5 路由模式 因此需要将多个 URL 重定向到客户端应用程序 我不确定如何进行通配符匹配才能正确执行此操作 目前我只是匹配多个级别的路径 如下所示 ap
  • 是否可以在 ASP.NET Web API 和 SPA 中使用基于 cookie 的身份验证?

    我想创建基于 angularjs 前端和 ASP NET Web API 的 Web 应用程序 我需要创建安全 api 但我无法在将实施此 Web 应用程序的公司服务器上使用基于令牌的身份验证 是否可以对 SPA 和 ASP NET Web
  • 切换按钮不适用于 AngularJS 和 Angular ui Bootstrap

    切换按钮出现 但不起作用 我现在在网上也有相同的代码 但它不起作用 但在 Plunker 中它可以工作 Plunker 切换按钮正在工作 http plnkr co edit R5F5D1FGyHiv9X1cfOoa p preview 在
  • Angular 中有主控制器好吗?

    我不知道这是否是一个好的做法 我在路由配置中定义了一个控制器 但是因为我的HomeCtrl is in ng if他听不到的声明loginSuccess所以我做了MainCtrl它监听loginSuccess并做出适当的反应 这段代码工作得
  • 如何发布数组多维角度js

    我在 angularjs 中有一个数组 示例如下 scope order qty 20 scope order adress Bekasi scope order city Bekasi 这个数组可以用这个代码发布 http method
  • 卸载/销毁 Angular 延迟加载组件

    我的设置与此处找到的帖子类似http ify io lazy loading in angularjs http ify io lazy loading in angularjs 处理 Angular 中我的应用程序的各种组件的延迟加载 我
  • 为什么混合插值和表达式是不好的做法

    来自文档 在表达式内嵌入插值标记 Note AngularJS 指令属性采用任一表达式or带有嵌入表达式的插值标记 已经被考虑了不好的做法将插值标记嵌入表达式中 AngularJS 开发人员指南 插值 https docs angularj
  • 将函数传递给指令以在链接中执行的正确方法

    我知道我们通常通过隔离范围将函数传递给指令 directive myComponent function return scope foo 然后在模板中我们可以这样调用这个函数
  • ui-router 获取谷歌分析状态更改的当前路径

    我正在尝试将状态路径发送到谷歌分析 有一些问题 我正在使用抽象状态 因此使用像 toState url 这样的东西是行不通的 因为它不会获取整个 url 我想过在 stateChangeSuccess 上使用 window location
  • Spring:自定义验证器未被调用

    我正在查看有关 Spring 自定义验证器的其他问题 但不幸的是我无法用建议的答案解决我的问题 我的问题如下 我有一个实体 帐户 并且创建了一个自定义验证器 AccountValidator 我在控制器 RegisterController
  • 条件数据注释

    有没有办法使数据注释成为有条件的 我有一张桌子Party我存储组织和个人的地方 如果我要添加一个组织 我不需要该字段surname是必需的 但前提是我要添加一个人 public class Party Required ErrorMessa
  • 关联的验证错误消息变得简单

    我的应用程序中有相当多的belongs to关联 其中一些是可选的 即关联可能为零 一些是强制性的 关联必须是有效的父记录 我最初的方法是使用我自己的验证方法来验证给定的 id 此处为强制关联 belongs to category val
  • 如何在 AngularJS 中获得更多堆栈跟踪

    我正在使用装饰器来更改 exceptionHandler行为 将日志发送到服务器 我的问题是异常的堆栈跟踪似乎毫无用处 仅显示堆栈的一部分 例如 语法错误 标记 未定义 不是列 NaN 处的主表达式 表达式 此处的表达式 at Error
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • 使用 jquery 和 php 测试表单输入是否为 1 或 2 位整数

    我有一个表单 其中有五个字段全部设置为 maxlength 2 基本上 我希望唯一可以输入的值是一位或两位整数 因为在将值存储在数据库中之前对这些字段执行计算 是否有任何 jquery 不允许用户输入不是整数的值 另外 用 jquery 和
  • ng-repeat 指定起始索引

    如何指定 ng repeat 指令将开始的索引而不是零 我有一组结果 我只需要指定起始结果 它不同于零 无需编写任何代码 Angular 已经通过existing内置limitTo https docs angularjs org api
  • 有没有办法防止输入 type=“number” 获得多个点值?

    我只想得到十进制值 如 1 5 0 56 等 但它允许多个点 有什么办法可以预防吗 您可以使用pattern属性

随机推荐