2016-01-20 38 views
1

我有一個角度的表單,即類別文本輸入和ID輸入。該ID必須是該類別唯一的。所以,如果我有Cat1以下項目:角形。如何獲得一些重新評估他人的投入?

Cat1 - 123 
Cat1 - 245 
Cat1 - 456 

然後,如果我試圖與該類別Cat1和ID 123進入一個新的項目,然後該輸入將不會是唯一的類別和形式不能被提交。如果該ID更改爲1234那麼它將是有效的。

爲了達到這個目的,我有一個叫做unique的自定義指令,它需要ngModel。它看起來像這 -

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

但是,如果驗證發現場不唯一基於類別,類別字段發生變化,那麼驗證器就不會reevaula TE。

enter image description here

這裏是什麼什麼這些的GIF見過一個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