当前位置: 首页 > 面试题库 >

使用$ http的AngularJS自定义表单验证

公孙智
2023-03-14
问题内容

我有一个看起来像这样的表格:

<form name="myForm" ng-submit="saveDeployment()">
    <input type="hidden" value="{{item.CloneUrl}}" name="cloneurl" />
    <input type="hidden" value="{{Username}}" name="username" />

    <input type="radio" name="deploymenttype" ng-model="item.deploymentType" value="azure" checked="checked">Azure 
    <br />
    <input type="radio" name="deploymenttype" ng-model="item.deploymentType" value="ftp">FTP

    <div id="azure" ng-show="item.deploymentType=='azure'">
        <label for="azurerepo">Azure Git Repo</label>
        <input type="text" name="azurerepo" ng-model="item.azurerepo" ng-class="{error: myForm.azurerepo.$invalid}" ng-required="item.deploymentType=='azure'" />
    </div>

    <div id="ftp" ng-show="item.deploymentType=='ftp'">
        <label for="ftpserver">FTP Server</label>
        <input type="text" name="ftpserver" ng-model="item.ftpserver" ng-class="{error: myForm.ftpserver.$invalid}" ng-required="item.deploymentType=='ftp'"  />

        <label for="ftppath">FTP Path</label>
        <input type="text" name="ftppath" ng-model="item.ftppath" ng-class="{error: myForm.ftppath.$invalid}" ng-required="item.deploymentType=='ftp'" />

        <label for="ftpusername">FTP Username</label>
        <input type="text" name="ftpusername" ng-model="item.ftpusername" ng-class="{error: myForm.ftpusername.$invalid}" ng-required="item.deploymentType=='ftp'"/>

        <label for="ftppassword">FTP Password</label>
        <input type="password" name="ftppassword" ng-model="item.ftppassword" ng-class="{error: myForm.ftppassword.$invalid}" ng-required="item.deploymentType=='ftp'"/>
    </div>

    <input type="submit" value="Save" ng-disabled="myForm.$invalid"/>

</form>

它的设置使得输入数据后所有必填字段和“保存”按钮都可以使用。但是,部分验证是,"Is the user already registered?"我将使用输入的数据使用$ http通过POST通过服务器访问服务器。

我应该在saveDeployment()函数中放置该逻辑还是有一个更好的放置位置?

  • 更新: *

我实现了以下内容,将其作为元素上的属性应用,但它在每次我不喜欢的按键上调用服务器/数据库:

 app.directive('repoAvailable', function ($http, $timeout) { // available
        return {
            require: 'ngModel',
            link: function (scope, elem, attr, ctrl) {
                console.log(ctrl);
                ctrl.$parsers.push(function (viewValue) {
                    // set it to true here, otherwise it will not 
                    // clear out when previous validators fail.
                    ctrl.$setValidity('repoAvailable', true);
                    if (ctrl.$valid) {
                        // set it to false here, because if we need to check 
                        // the validity of the email, it's invalid until the 
                        // AJAX responds.
                        ctrl.$setValidity('checkingRepo', false);

                        // now do your thing, chicken wing.
                        if (viewValue !== "" && typeof viewValue !== "undefined") {
                            $http.post('http://localhost:12008/alreadyregistered',viewValue) //set to 'Test.json' for it to return true.
                                .success(function (data, status, headers, config) {
                                    ctrl.$setValidity('repoAvailable', true);
                                    ctrl.$setValidity('checkingRepo', true);
                                })
                                .error(function (data, status, headers, config) {
                                    ctrl.$setValidity('repoAvailable', false);
                                    ctrl.$setValidity('checkingRepo', true);
                                });
                        } else {
                            ctrl.$setValidity('repoAvailable', false);
                            ctrl.$setValidity('checkingRepo', true);
                        }
                    }
                    return viewValue;
                });

            }
        };
    });

问题答案:

您不需要在指令中发出$ http请求,更好的地方是控制器。

您可以在控制器内部指定方法- $scope.saveDeployment = function () { // here you make and handle your error on request ... };将错误保存到范围中,然后创建一个指令来监视$scope.yourResponseObject并基于该指令设置有效性。

同样,如果您需要类似输入字段模糊的请求和错误之类的东西,则需要创建一个简单的指令,并elem.bind('blur', ...)在其中$scope.saveDeployment使用回调调用以处理有效性。

看一下示例,可能会有类似的东西-https: //github.com/angular/angular.js/wiki/JsFiddle-
Examples



 类似资料:
  • 在中有一个方法,但它看起来不像是一个公共API,所以我宁愿不使用它。创建自定义指令并使用看起来是另一种选择,但基本上需要为每个自定义验证规则创建一个指令,而我不希望这样做。 实际上,在最简单的场景中,将控制器中的某个字段标记为无效(同时保持同步)可能是我完成任务所需要的,但我不知道如何做到这一点。

  • 问题内容: 我有一个带有输入字段和通过添加属性等进行验证设置的表单。但是对于某些领域,我需要做一些额外的验证。我将如何“利用” 控制的验证? 自定义验证可能类似于“如果填写了这3个字段,则此字段是必需的,并且需要以特定方式进行格式化”。 有一个方法,但是看起来不像公共API,所以我宁愿不使用它。创建自定义指令并使用它看起来像另一个选项,但是基本上需要我为每个自定义验证规则创建一个指令,而这是我所不

  • 本文向大家介绍AngularJS自动表单验证,包括了AngularJS自动表单验证的使用技巧和注意事项,需要的朋友参考一下 AngularJS的另外一种表单验证方式是自动验证,即通过directive来实现,除了AngularJS自带的directive,还需要用到angular-auto-validate这个第三方module。 有关angular-auto-validate: 安装:npm i

  • 我有一个名为的自定义验证器函数。 如果我像这样设置表单,一切都工作了: 但是,如果我使用这样的表单生成器设置表单: 如果构造函数中将定义为,则验证不起作用。所谓“不工作”,我的意思是表单的valid属性不正确,在控制台中我看不到预期的输出(使用第一个方法显示)。 我没有在第二个方法中正确定义验证器(如果是这样的话,应该如何定义它),或者FormBuilder有什么东西使自定义验证器不可用?

  • 问题内容: 角度自定义表单组件/指令和$ dirty属性 使用常规输入时,例如 在输入框中键入后为true。 我想创建一个简单的指令,例如 样本用法为 在用户单击两个按钮中的任何一个之后,设置为true。 这是如何完成的? 问题答案: 在DDO中使用ngModel控制器和属性的对象形式: 用法: 通过实例化和使用ng- model控制器 ,该指令将根据需要自动设置表单控件。 演示 我建议隔离范围作

  • 问题内容: 我决定编写一个自定义指令来帮助我验证输入框。这个想法是,我将新的fancy 指令添加到引导程序中,它将检查my is 或is 并根据需要应用or 类。 出于某种奇怪的原因,我的指令在正常情况下可以正常工作,但是在ui-bootstrap模态内部完全忽略了添加的指令。 模态和形式相同的代码 我可爱的指令 在插件上查看:http ://plnkr.co/edit/AjvNi5e6hmXcT