Validate formly angularjs字段不相同

Validate formly angularjs字段不相同,angularjs,angular-formly,Angularjs,Angular Formly,我在单击时动态添加了字段 addNewFiled() { let parent = this; this.scope.fields.push({ key: 'field-'+parent.scope.fields.length, type: 'horizontalInput', templateOptions: { placeholder :'E

我在单击时动态添加了字段

       addNewFiled() {
        let parent = this;
        this.scope.fields.push({

            key: 'field-'+parent.scope.fields.length,
            type: 'horizontalInput',
            templateOptions: {
                placeholder :'Enter Field',
                label: 'Filed',
                required: false
            },
            validators: {
                fieldFormat: function($viewValue, $modelValue, scope) {

                    let value = $viewValue;
                    if(value.length != 12){
                        scope.to.message = "Field should be 12 characters";
                        return false;
                    }

                    return true;
                }
            }

        });


    }

我需要的是验证输入的值是否不在验证器的另一个字段中,我尝试在模型中循环,但效率不高,非常感谢任何帮助。

我曾经遇到过这种情况,我使用2个映射解决了这个问题 基本上,您将有2个映射,其中一个将包含映射到其值的字段索引,第二个映射将包含映射到该值的重复次数的字段值 在验证器中,减少先前值的重复次数(在完成其他验证之后),增加新值的重复次数,并检查其是否大于1,然后重复

在对话框中定义两个贴图

    private valuesMap: any = [];
    private keysArray:any = [];
在字段中,插入控制器以保存当前字段的索引

     controller: function ($scope) {
                $scope.index = parent.scope.fields.length-1;
                parent.keysArray[$scope.index] = $scope.index;
            },
然后在你的验证器中

    if(value) {


        if(angular.isDefined(parent.valuesMap[parent.keysArray[scope.index]])) {
            parent.valuesMap[parent.keysArray[scope.index]]= parent.valuesMap[parent.keysArray[scope.index]] -1;

        }

        parent.keysArray[scope.index] = value;
        if(angular.isDefined(parent.valuesMap[value]) && parent.valuesMap[value] > 0) {
            parent.valuesMap[value] = parent.valuesMap[value]+1;
            scope.to.message = "Value is already entered";
            return false;
        }
        parent.valuesMap[value] = 1;


    }

希望这适用于您的场景

您不需要验证程序,通过templateOptions中的minlength和maxlength属性,已经存在字段长度的默认验证

只需这样做:

templateOptions: {
                placeholder :'Enter Field',
                label: 'Filed',
                required: false,
                minlength: 12,
                maxlength: 12
            },

谢谢,我将尝试此解决方案我知道,但我这样做是为了指定我自己的消息,问题不是长度,而是验证所有字段是否都不相同为什么会被否决?答案是正确的。我整天都在里面工作,我很清楚我在说什么。您只需在字段上放置一个监视程序即可完成此操作。它将检查两个或多个字段中是否存在相同的值?老实说,最简单的方法是将其他值添加到数组中,然后查看数组是否包含$viewValue,如果它在验证器中返回false,那么现在你看到这个答案不是针对这个问题的,基本上这个方法与我在问题中提到的方法相同,我说它没有效率,因为验证器是在每个键按下时触发的,你需要一个恒定的访问时间,如果你看到他设法做到这一点的被接受的答案