Javascript 回调函数内部的角度形式验证-angular 1.2.5

Javascript 回调函数内部的角度形式验证-angular 1.2.5,javascript,validation,angularjs,angularjs-directive,indexeddb,Javascript,Validation,Angularjs,Angularjs Directive,Indexeddb,我正在使用indexedDb作为存储的应用程序。在其中一个表单中,在检查是否存在密钥时,我遇到了一个奇怪的错误。下面是我的验证指令代码 app.directive('ensureUnique',['abcService', function ($abcService){ return { require : 'ngModel', link : function(scope,elem,attr,ctrl) { scope.$watch(attr.ngModel, f

我正在使用indexedDb作为存储的应用程序。在其中一个表单中,在检查是否存在密钥时,我遇到了一个奇怪的错误。下面是我的验证指令代码

app.directive('ensureUnique',['abcService', function ($abcService){
return {
    require : 'ngModel',
    link : function(scope,elem,attr,ctrl) {
        scope.$watch(attr.ngModel, function(){
             var checkExpenseType = $abcService.checkExpenseType();
             var index = checkExpenseType.get(scope.newExpenseName );
             index.onsuccess = function (e) {
                var result = e.target.result;
                if(result) {
                    ctrl.$setValidity('exists', true);
                 }else{
                    ctrl.$setValidity('exists', false);
                 }
             };
             index.onerror = function(e) {
                // TODO
             };   
        });
    }, 
  }}
]);
输入文本时,如果值与db中的键匹配,则第一次显示正确的错误消息。在下一次按键时,错误消失,这是正确的行为,但对于后续按键,错误再次出现,即使按键在DB中不存在

 For example if "Food"  is the key in DB
 Foo - No error
 Food - Error - Key exists
 Foods - No error
 Foodss - Error - key exists
 Foodsss - Error - key exists
 ...       
由于存在3个字符的最小长度标准,因此在输入3个字符之前不会触发指令

还请让我知道我是否以预期的方式进行验证,或者是否存在更好的方式


提前谢谢

我把你的小提琴叉起来,做了一些改动

首先,我添加了一个作用域。$apply(),因为您的验证是异步进行的,因此超出了angular的摘要周期

其次,如果找到匹配项,我将$setValidity替换为false,如果未找到匹配项,则将$setValidity替换为true。如果您想在条目已经存在的情况下使字段无效,我相信这是正确的

if(result) {
    // If a match is found, mark the field as invalid.
    ctrl.$setValidity('exists', false); 
}else{
    // If a match is not found mark "exists" as valid.
    ctrl.$setValidity('exists', true);
}
// Apply the validation changes.
scope.$apply();

这里是小提琴抱歉意识到我的第一篇文章是一个未更改的小提琴-现在更新。太棒了!很乐意帮忙。