使用索引位置对字段进行验证 [英] Validation on fields using index position

查看:99
本文介绍了使用索引位置对字段进行验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个要动态复制的字段.我正在使用ng-reapt来完成这项工作.但是,验证消息不起作用.这就是我所拥有的:

I have a couple of fields that I would like to replicate dynamically. I'm using ng-reapt which is doing the job. However, the validation messages are not working. Here's what I've got:

<html ng-app="app">
    <head>
        <title>teste</title>
    </head>
    <body ng-controller='testController'>
        <label>Number of Workers</label>
        <select ng-model="quantity" ng-change="changed()">
            <option value="1" selected="selected">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
        </select>

        <form name='frm' action='/workers/add' method='POST'>
            <div ng-repeat="i in numberOfWorkers track by $index">{{$index + 1}}
                <div>
                    <label>First Name</label>
                    <input class="fullSize" letters-only placeholder="Please enter your name" type="text" name="firstName" ng-model="workers[$index].firstName" ng-minlength="3" ng-maxlength="50" ng-required="true" maxlength="50">
                    <span ng-cloak class="error-container" ng-show="submitted || showErrors(frm.firstName)">
                        <small class="error" ng-show="frm.firstName[{{$index}}].$error.required">* Please enter your name.</small>
                        <small class="error" ng-show="frm.firstName[{{$index}}].$error.minlength">* At least 3 chars.</small>
                        <small class="error" ng-show="frm.firstName[{{$index}}].$error.maxlength">* No more than 50 chars.</small>
                    </span>
                </div>
                <div>
                    <label>Surname</label>
                    <input class="fullSize" letters-only placeholder="Please enter your surname" type="text" name="surName" ng-model="workers[$index].surName" ng-minlength="3" ng-maxlength="50" ng-required="true" maxlength="50">
                    <span ng-cloak class="error-container" ng-show="submitted || showErrors(frm.surName)">
                        <small class="error" ng-show="frm.surName[$index].$error.required">* Please enter your name.</small>
                        <small class="error" ng-show="frm.surName[$index].$error.minlength">* At least 3 chars.</small>
                        <small class="error" ng-show="frm.surName[$index].$error.maxlength">* No more than 50 chars.</small>
                    </span>                 
                </div>
                <div>
                    <label>Email</label>
                    <input class="grid-full" placeholder="Please enter your e-mail" type="email" name="email" ng-model="workers[$index].email" ng-minlength="3" ng-maxlength="50" required maxlength="50">
                    <span class="error-container" ng-show="submitted || showErrors(frm.email)">
                        <small class="error" ng-show="frm.email[$index].$error.required">* Please enter your E-mail.</small>
                        <small class="error" ng-show="frm.email[$index].$error.email">* Invalid email.</small>
                    </span>
                </div>

            </div>
        </form>

        <button ng-click="test()">test</button>

        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
        <script>
            var app = angular.module("app",[]);
            app.controller('testController',['$scope', function($scope){

                $scope.quantity = 1;
                $scope.submitted = false;
                $scope.numberOfWorkers = [1];
                $scope.workers = [];

                $scope.getNumber = function (num) {
                    return new Array(num);
                };

                $scope.test = function(){

                    console.log($scope.workers);
                };

                $scope.changed = function() {
                  $scope.workers = [];
                  $scope.numberOfWorkers = new Array(parseInt($scope.quantity));
                }


                $scope.isUndefined = function (thing) {
                    var thingIsUndefined = (typeof thing === "undefined");

                    return thingIsUndefined;
                };

                $scope.showErrors = function (field) {
                    var fieldIsUndefined = $scope.isUndefined(field);

                    if (fieldIsUndefined == false)
                    {
                        var stateInvalidIsUndefined = $scope.isUndefined(field.$invalid);
                        var stateDirtyIsUndefined = $scope.isUndefined(field.$dirty);

                        return (fieldIsUndefined == false && stateInvalidIsUndefined == false && stateDirtyIsUndefined == false &&
                            (field.$invalid && field.$dirty));
                    }
                    return false;
                };

            }]);
        </script>
    </body>
</html>

是否可以使用索引位置显示和验证字段?

Is there a way to display and validate fields using the index position?

frm.firstName.$error.minlength

上面的代码适用于第一个程序段,但它将消息显示给所有副本.

The code above works for the first block, but it display the message to all copies.

推荐答案

我认为这与您要实现的目标类似:

I think this along the lines of what you're trying to achieve:

http://plnkr.co/edit/HVwnRfvt30WrsteY6DvW

我们需要通过使用ngRepeat$index将动态的name分配给每个输入字段:

We need to assign a dynamic name to each input field, by way of using the $index of the ngRepeat:

<form name="form">
    <div ng-repeat="entry in array track by $index">
        <input type="text" name="someField{{$index}}">
    <div>
</form>

根据array中的条目数,我们可以使用以下语法循环访问每个动态创建的someField:

And based on the number of entries in array, we can access in a loop each dynamically created someField using the syntax below:

form['someField' + $index]

在您的情况下,假设我们有三个工作人员,而第二个工作人员的firstName无效-在ngRepeat中,它看起来像这样:

In your case, let's say we have three workers, and the second worker's firstName is invalid -- in an ngRepeat, it would look like this:

  <div ng-repeat="i in numberOfWorkers track by $index">
    isValid? --> form.firstName{{$index}}.$valid = {{form['firstName' + $index].$valid}}
  </div>

输出:

isValid? --> form.firstName0.$valid = true
isValid? --> form.firstName1.$valid = false
isValid? --> form.firstName2.$valid = true

这篇关于使用索引位置对字段进行验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆