Forms 使用angularjs对给定嵌套级别的字段强制执行不区分大小写的唯一性

Forms 使用angularjs对给定嵌套级别的字段强制执行不区分大小写的唯一性,forms,validation,angularjs,unique,Forms,Validation,Angularjs,Unique,我的问题是:如何确保表单有效,嵌套的toValidates具有唯一的值,但仅在同一个外部div中? 我猜这个逻辑应该放在一个outerclass指令中,但我似乎不知道这个逻辑应该是什么样的 如有任何建议,将不胜感激 谢谢 Angular主页上的“tabs”和“pane”指令解决了一个类似的问题——子“pane”指令需要与父“tabs”指令通信 在outerclass指令上定义一个控制器,然后在控制器上定义一个方法(使用thisnot$scope)。然后在toValidate指令中要求:“^out

我的问题是:如何确保表单有效,嵌套的toValidates具有唯一的值,但仅在同一个外部div中? 我猜这个逻辑应该放在一个outerclass指令中,但我似乎不知道这个逻辑应该是什么样的

如有任何建议,将不胜感激


谢谢

Angular主页上的“tabs”和“pane”指令解决了一个类似的问题——子“pane”指令需要与父“tabs”指令通信

在outerclass指令上定义一个控制器,然后在控制器上定义一个方法(使用
this
not$scope)。然后在toValidate指令中要求:“^outerclass”。在toValidate link函数中,您可以$watch查看值的更改,并调用outerclass控制器上的方法向上传递值。执行outerclass指令中的验证


另请参见。

这是怎么回事。outerClassDirective应该有一个控制器,它将使用的值存储在数组中。它将在其主体中转置输入字段。toValidate指令需要outerClassDirective,并将模型值添加到数组中,使其在存在时无效

下面是一个尝试(未经测试):

app.directive('outerClass',function(){
var值=[];
var valid=true;
返回{
模板:“”,
是的,
替换:正确,
要求:'ngModel',
控制器:函数(){
this.addValue:函数(值){
valid=值。indexOf(value)>-1;
值。推送(值);
};
},
链接:函数(范围、elm、属性、ctrl){
ctrl.$setValidity('toValidate',valid)
}
};
});
app.directive('toValidate',function(){
返回{
要求:“^outerClass”,
链接:函数(范围、elm、属性、ctrl){
ctrl.addValue(属性值);
} 
}
};
});

您是指在文本字段中键入的唯一值吗?是的,在初始页面加载时键入或从服务器填充。通常,在服务器上填充字段是个坏主意。最好将JSON从服务器发送到客户端,让Angular来处理。@blesh,对不起,这就是我说的“从服务器填充”的意思,我应该更清楚。我可能过早地接受了-我已经修复了语法错误,现在似乎得到了以下信息:错误:无控制器:ngModel有什么想法吗?谢谢您的outerClass标记需要ng模型属性。啊,是的。谢谢有什么建议可以使ng模型具有良好的价值?我目前已将其设置为ng model=“$index”(嵌套在ng repeat中),因为(我不认为?)我需要将divs模型绑定到任何东西?您不了解设置。如果其中一个输入标记检测到其值已存在,则会将父标记(outerClass)上的模型标记为无效。因此,您只需要一个新的模型对象(例如groupofields),您可以在表单提交时测试它(例如if(groupofields.$invalid)…)。
 <FORM>
 <DIV class="outer-class">
      <INPUT class="toValidate" type = "text"/>
      <INPUT class="somethingElse" type= "text"/>
      <INPUT class="toValidate" type ="text"/>
 </DIV>
 <DIV class="outer-class">
      <INPUT class="toValidate" type = "text"/>
      <INPUT class="somethingElse" type= "text"/>
      <INPUT class="toValidate" type ="text"/>
 </DIV>
 <INPUT type="submit"/>
 </FORM>
app.directive('outerClass', function() {
   var values = [];
   var valid = true;
   return {
      template: '<div ng-transclude></div>',
      transclude: true,
      replace: true,
      require: 'ngModel',
      controller: function() {
         this.addValue: function(value) {
            valid = values.indexOf(value) > -1;
            values.push(value);
         };
      },
      link: function(scope, elm, attrs, ctrl) {
         ctrl.$setValidity('toValidate', valid)
      }
   };
});

app.directive('toValidate', function() {
   return {
        require: '^outerClass',
        link: function(scope, elm, attrs, ctrl) {
           ctrl.addValue(attrs.value);
        } 
      }
   };
});