2016-01-20 2 views
1

У меня есть форма в угловом, что текстовый ввод категории и вход ID. Идентификатор должен быть уникальным для категории. Так что, если у меня есть следующие пункты для Cat1:Угловые формы. Как получить некоторые данные для переоценки других?

Cat1 - 123 
Cat1 - 245 
Cat1 - 456 

Тогда Если я пытался ввести новый элемент с категорией Cat1 и ид 123 то, что вход не будет уникальным для категории и форма не может быть представленным. Если идентификатор изменился на 1234, тогда он будет действителен.

Для этого у меня есть пользовательская директива, называемая unique, которая требует ngModel. Похоже this-

HTML-

<input name="ID" 
     required 
     unique="id in getItemsByCategory(newCategory)" 
     type="text" 
     ng-model="newId"></input> 

JS-

.directive('unique', function() { 
    return { 
     require: '^ngModel', 
     link: function(scope, ele, attr, ngModelController) { 
     ngModelController.$validators.unique = function(val) { 
      var uniqueInRegex = /([^\s]+)\s+in\s([^\s]+)/i; 

      var matches = attr.unique.match(uniqueInRegex); 
      var property = matches[1]; 
      var collection = scope.$eval(matches[2]); 

      for(var i = 0; i < collection.length; i++) { 
      var item = collection[i]; 
      if(item[property] === val) { 
       console.log('not unique'); 
       return false; 
      } 
      } 

      console.log('unique'); 
      return true; 
     }; 
     } 
    }; 
    }); 

который работает отлично:

enter image description here

Но если валидатор находит поле не является уникальным в зависимости от категории и изменения поля категории, тогда валидатор не ресевал т.е.

enter image description here

Вот JSBin о том, что то, что видел в этой гифе:

http://jsbin.com/wubesutugo/edit?html,js,output

Есть в любом случае я могу иметь один вход «сенсорные» другой вход, когда он изменяет? Я хочу, чтобы эта директива валидации была общей, потому что у меня есть несколько мест, которые я хотел бы использовать. Поэтому я не хочу эту логику в контроллере.

+0

Я нашел решение, но Я оставлю этот вопрос открытым дольше, если будет лучшее решение. На вкладке «Категория» у меня есть ng-изменение, которое выглядит следующим образом: « ' –

ответ

0

Ваше решение с ng-change является достаточным. Альтернативой будет использовать часы ($watchCollection, чтобы быть точным): (. Также демонстрирует расчетливый регулярное выражение только один раз)

.directive('unique', function() { 
    var uniqueInRegex = /([^\s]+)\s+in\s([^\s]+)/i; 
    return { 
     require: '^ngModel', 
     link: function(scope, ele, attr, ngModelController) { 
     var matches = attr.unique.match(uniqueInRegex); 
     var property = matches[1]; 
     var collectionExpr = matches[2]; 

     scope.$watchCollection(collectionExpr, function(newval) { 
      ngModelController.$validate(); 
     }); 

     ngModelController.$validators.unique = function(val) { 
      var collection = scope.$eval(collectionExpr); 
      for(var i = 0; i < collection.length; i++) { 
      var item = collection[i]; 
      if(item[property] === val) { 
       console.log('not unique'); 
       return false; 
      } 
      } 

      console.log('unique'); 
      return true; 
     }; 
     } 
    }; 
}) 

Попробуйте: http://jsbin.com/wiyugozuje/1/edit?js,console,output

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