2014-09-12 3 views
0

Я работаю с AngularJs 1.2. У меня проблема с $ setValidity.

У меня есть форма ввода с нг-повторить:

<div ng-repeat="(key, value) in addition_page"> 
    <input ng-model="addition_page[key].name" name="pagename[{{key}}]" not-duplicated="1"> 
</div> 

Теперь мне нужно использовать $ setValidity на некоторые уточнения ввода, но мне не удалось

scope["finish_form"]["pagename[0]"].$setValidity('not-duplicated', false); 

Я попытался войти:

console.log(scope["finish_form"]["pagename[0]"]) => return undefined 
console.log(scope["finish_form"]["pagename[{{key}}]"]) => return last input 

Я проверил элемент в браузере, pagename [0] существует.

Мне нужна помощь, плз.

Спасибо всем.

Update:

.directive('notDuplicated', [function() { 
      return { 
       require: 'ngModel', 
       link: function(scope, elem, attr, ngModel) { 
        var val_id = attr.notDuplicated; 

        var setValidity = function(value) { 
         if (value === "") return true; 
         var same_now = []; 
         var same_past = []; 
         angular.element("[not-duplicated=" + val_id + "]").each(function(k, v) { 
          if (angular.element(v).val() === value) { 
           same_now.push(k); 
          } 
          if (ngModel.$modelValue !== "" && angular.element(v).val() === ngModel.$modelValue) { 
           same_past.push(k); 
          } 
         }) 

         // mark old input is valid 
         if (same_past.length === 1) { 
          scope["finish_form"]["pagename[" + same_past[0] + "]"].$setValidity('not-duplicated', true); 
         } 

         // mark new inputs is invalid 
         if (same_now.length > 1) { 
          same_now.each(function(k) { 
           scope["finish_form"]["pagename[" + k + "]"].$setValidity('not-duplicated', false); 
          }); 
          return false; 
         } 
         return true; 

        } 

        //For DOM -> model validation 
        ngModel.$parsers.unshift(function(value) { 
         var valid = setValidity(value); 
         return valid ? value : undefined; 
        }); 

        //For model -> DOM validation 
        ngModel.$formatters.unshift(function(value) { 
         setValidity(value); 
         return value; 
        }); 
       } 
      }; 
     }]); 
+0

где вы это делаете: "scope [" finish_form "] [" pagename [0] "]. $ SetValidity ('not-duplicated', false);"? Выполняете ли вы это внутри функции ссылки специальной директивы проверки? – Josep

+0

Выполняете ли вы это внутри функции ссылки специальной директивы проверки? => Да. Внутри ngModel. $ Parsers.unshift и ngModel. $ Formatters.unshift –

+0

mmmmmmm, не могли бы вы поделиться остальной частью этого кода? – Josep

ответ

1

Это происходит потому, что имя элемента управления (та, с которой он зарегистрирован на его исходной форме) извлекается в процессе конкретизации ngModelController «s, который according to the docs происходит до пре -связывающая фаза * (поэтому интерполяция еще не была).

Если вы проверите свойства myForm, вы узнаете, что все входы зарегистрированы как «pagename [{{key}}]».


Посмотрите на this answer для более подробного объяснения и возможного решения (используя дополнительную директиву).

+0

Спасибо. Динамическая директива имен решает мою проблему. –

+0

@ LêTrầnTiếnTrung: Приятно знать :) Не стесняйтесь также отстаивать другой ответ, чтобы другие люди знали, что это помогло вам с вашей проблемой. – gkalpak

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