回调函数内的角形验证 - 角度1.2.5

时间:2013-12-27 11:30:04

标签: 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, 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个字符之前不会触发指令。

如果我以预期的方式进行验证或存在更好的方式,请告诉我

提前致谢

1 个答案:

答案 0 :(得分:1)

我已经分叉了你的小提琴并做了一些改变。 http://jsfiddle.net/U9y3H/1

首先,我添加了一个范围。$ apply(),因为你的验证是异步发生的,因此在angular的摘要周期之外。

其次,如果找到匹配项,我将$ setValidity交换为false,如果找不到匹配项,则为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();