当前位置: 首页 > 知识库问答 >
问题:

AngularJS-服务器端验证和客户端表单

宗意蕴
2023-03-14

我试图了解如何做以下事情:

声明表单的公认方式是什么。我的理解是您只需用超文本标记语言声明表单,然后添加ng-model指令,如下所示:

ng-model="item.name"

发送到服务器的内容。我可以将item对象作为JSON发送到服务器,并对其进行解释。然后我可以对对象执行验证。如果失败,我抛出一个JSON错误,并返回具体内容?有没有公认的方法?如何以一种好的方式将验证错误从服务器推送到客户端?

我真的需要一个例子,但是Angulars文档很难理解。

编辑:看来我的问题措辞不当。

我知道如何验证客户端,以及如何在promise回调时处理错误/成功。我想知道的是,将服务器端错误消息捆绑到客户端的公认方式。假设我有一个用户名和密码注册表单。我不想轮询服务器的用户名,然后使用Angular来确定是否存在重复项。我想将用户名发送到服务器,验证不存在具有相同名称的其他帐户,然后提交表单。如果出现错误,我如何将其发送回?

将数据按原样(键和值)推送到服务器,并附加一个错误字段,如下所示:

{
  ...data...

  "errors": [
    {
      "context": null,
      "message": "A detailed error message.",
      "exceptionName": null
    }
  ]
}

然后绑定到DOM。

共有3个答案

公良俊楚
2023-03-14

Derek Ekins给出的答案很好。但是:如果您使用“myForm.invalid”禁用“submit”按钮,则该按钮不会自动返回到“enabled”,因为基于服务器的错误状态似乎没有改变。即使您再次编辑表单中的所有字段以符合有效输入(基于客户端验证),也不行。

松正阳
2023-03-14

我有和Derek类似的解决方案,在codetunes博客上描述过。TL;博士:

>

  • 以与Derek的解决方案类似的方式显示错误:

    <span ng-show="myForm.fieldName.$error.server">{{errors.fieldName}}</span>
    

    添加指令,该指令将在用户更改输入时清除错误:

    <input type="text" name="fieldName" ng-model="model.fieldName" server-error />
    
    angular.module('app').directive 'serverError', ->
      {
        restrict: 'A'
        require: '?ngModel'
        link: (scope, element, attrs, ctrl) ->
          element.on 'change', ->
            scope.$apply ->
              ctrl.$setValidity('server', true)
      }
    

    通过将错误消息传递给作用域并告诉表单有错误来处理错误:

    errorCallback = (result) ->
      # server will return something like:
      # { errors: { name: ["Must be unique"] } }
      angular.forEach result.data.errors, (errors, field) ->
        # tell the form that field is invalid
        $scope.form[field].$setValidity('server', false)
        # keep the error messages from the server
        $scope.errors[field] = errors.join(', ') 
    

    希望它会有用:)

  • 岳锦
    2023-03-14

    我最近也在玩这种东西,我已经制作了这个演示。我认为它能满足你的需要。

    使用您想要使用的任何特定客户端验证,按照常规设置表单:

    <div ng-controller="MyCtrl">
        <form name="myForm" onsubmit="return false;">
            <div>
                <input type="text" placeholder="First name" name="firstName" ng-model="firstName" required="true" />
                <span ng-show="myForm.firstName.$dirty && myForm.firstName.$error.required">You must enter a value here</span>
                <span ng-show="myForm.firstName.$error.serverMessage">{{myForm.firstName.$error.serverMessage}}</span>
            </div>
            <div>
                <input type="text" placeholder="Last name" name="lastName" ng-model="lastName"/>
                <span ng-show="myForm.lastName.$error.serverMessage">{{myForm.lastName.$error.serverMessage}}</span>
            </div>
            <button ng-click="submit()">Submit</button>
        </form>
    </div>
    

    注意,我还为每个字段添加了一条服务器消息:

    <span ng-show="myForm.firstName.$error.serverMessage">{{myForm.firstName.$error.serverMessage}}</span>
    

    这是一条从服务器返回的可定制消息,其工作方式与任何其他错误消息相同(据我所知)。

    这是控制器:

    function MyCtrl($scope, $parse) {
          var pretendThisIsOnTheServerAndCalledViaAjax = function(){
              var fieldState = {firstName: 'VALID', lastName: 'VALID'};
              var allowedNames = ['Bob', 'Jill', 'Murray', 'Sally'];
    
              if (allowedNames.indexOf($scope.firstName) == -1) fieldState.firstName = 'Allowed values are: ' + allowedNames.join(',');
              if ($scope.lastName == $scope.firstName) fieldState.lastName = 'Your last name must be different from your first name';
    
              return fieldState;
          };
          $scope.submit = function(){
              var serverResponse = pretendThisIsOnTheServerAndCalledViaAjax();
    
              for (var fieldName in serverResponse) {
                  var message = serverResponse[fieldName];
                  var serverMessage = $parse('myForm.'+fieldName+'.$error.serverMessage');
    
                  if (message == 'VALID') {
                      $scope.myForm.$setValidity(fieldName, true, $scope.myForm);
                      serverMessage.assign($scope, undefined);
                  }
                  else {
                      $scope.myForm.$setValidity(fieldName, false, $scope.myForm);
                      serverMessage.assign($scope, serverResponse[fieldName]);
                  }
              }
          };
    }
    

    我在假装Thisisontheserverandcalledviaajax中调用服务器,你可以用一个ajax调用替换它,关键是它只返回每个字段的验证状态。在这个简单的例子中,我使用值VALID来表示字段有效,任何其他值都被视为错误消息。你可能想要更复杂的东西!

    从服务器获得验证状态后,只需更新表单中的状态。

    您可以从scope访问表单,在这种情况下,表单称为myForm。myForm为您获取表单。(如果您想了解表单控制器的工作原理,请参阅此处)。

    然后,您想告诉表单该字段是否有效/无效:

    $scope.myForm.$setValidity(fieldName, true, $scope.myForm);
    

    $scope.myForm.$setValidity(fieldName, false, $scope.myForm);
    

    我们还需要设置错误消息。首先,使用$parse获取字段的访问器。然后从服务器分配值。

    var serverMessage = $parse('myForm.'+fieldName+'.$error.serverMessage');
    serverMessage.assign($scope, serverResponse[fieldName]);
    

    希望那有帮助

     类似资料:
    • 问题内容: 我试图了解如何执行以下操作: 声明表单的可接受方式是什么。我的理解是,您只需用HTML声明表单,并添加ng-model指令,如下所示: 要发送到服务器的内容。我可以将item对象作为JSON发送到服务器,然后对其进行解释。然后,我可以对对象执行验证。如果失败,则抛出JSON错误,然后发回确切的信息?有接受的方式吗?如何以一种很好的方式将验证错误从服务器推送到客户端? 我确实需要一个示例

    • 问题内容: 进行客户端或服务器端验证哪个更好? 在我们的情况下,我们正在使用 jQuery和MVC。 在我们的视图和控制器之间传递的JSON数据。 我所做的许多验证工作都是在用户输入数据时对其进行验证。例如,我使用该事件来防止文本框中的字母,设置最大字符数,并且该数字在一定范围内。 我想更好的问题是,与客户端相比,进行服务器端验证是否有任何好处? 真棒的答案大家。我们拥有的网站受到密码保护,并且用

    • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

    • 问题内容: 我正在建立一个使用RESTful API(Jersey)的AngularJS网络应用程序。 在服务器端,我正在使用Java应用程序服务器(详细来说是Glassfish 4)。 我的设置如下: AngularJS Webapp作为单个war文件部署到Java EE应用程序服务器。 RESTfulAPI(和后端逻辑)也作为war文件部署到同一Java EE应用程序服务器。 AngularJ

    • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

    • 问题内容: 我有一个角度应用程序,其中包含一个从示例中获取的保存按钮: 这对于客户端验证非常有用,因为当用户解决问题时它会变为false,但是我有一个电子邮件字段,如果另一个用户使用相同的电子邮件注册,则该字段设置为无效。 一旦我将电子邮件字段设置为无效,就无法提交表单,并且用户无法修复该验证错误。所以现在我不能再使用来禁用我的提交按钮。 肯定有更好的办法 问题答案: 我在几个项目中都需要这样做,