我正在使用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个字符之前不会触发指令。
如果我以预期的方式进行验证或存在更好的方式,请告诉我
提前致谢
答案 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();