2017-02-14 2 views
-2

У меня есть динамически добавленные поля при нажатии.Validate formly angularjs поля не совпадают

 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; 
       } 
      } 

     }); 


    } 

Что мне нужно, чтобы подтвердить введенное значение не в другом поле в валидатор, я попытался перекручивание через модель, но ее не эффективной, любая помощь приветствуется.

ответ

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; 


    } 

Надеюсь, что это работает с вашим сценарием

+0

Спасибо, я попробую это решение –

+0

Спасибо он работал отлично! –

-1

Вам не нужен валидатор, уже существует проверка по умолчанию для длины поля через свойства minlength и maxlength в templateOptions.

Просто сделать это:

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

Я знаю, но я делаю это, чтобы указать свое собственное сообщение, и вопрос был не о длине, а о проверке того, что все поля не совпадают. –

+0

Почему это не используется? Ответ правильный. Я работаю в этом весь день на работе, я уверен, что знаю, о чем говорю. Вы могли бы просто поместить наблюдателя в поля, которые могли бы выполнить это. – MattE

+0

Он проверит, есть ли одно и то же значение в двух или более полях? –

Смежные вопросы