形式上的angularjs字段验证不一样

时间:2017-02-14 08:25:48

标签: angularjs angular-formly

我在点击时动态添加了字段。

       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 个答案:

答案 0 :(得分:1)

我曾遇到过这种情况,我用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;


    }

希望这适用于你的场景

答案 1 :(得分:-1)

您不需要验证器,已经通过templateOptions中的minlength和maxlength属性对字段长度进行了默认验证。

只需这样做:

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