通过摘要运行验证指令
Run validation directive via digest
此指令用于确定给定值是否在与其关联的数据列表中。当我输入输入时,它可以完美运行,但如果数据列表由于周期(向其添加值)而更改$digest则它将无法工作。如果我随后更新输入,它将正常运行。
app.directive('list', function (){
return {
restrict: "A",
require: "ngModel",
priority: 100,
link: function(scope, elem, attr, ngModel){
var list;
//For DOM -> model validation
ngModel.$validators.list = function(value){
if(!list){
var options = document.getElementById(attr.list).options;
var list = [];
for(var i=options.length-1; i>=0; i--){
if(isString(options[i].getAttribute("valid"))){
if(options[i].label){list.push(options[i].label.toLowerCase())}
if(options[i].value){list.push(options[i].value.toLowerCase())}
}
};
}
var valid = (value||!value==""?list.indexOf(value.toLowerCase()) !== -1:true);
return (!list.length)||valid;
};
}
};
});
您需要
监视列表,然后触发ngModel.$validate();
然后运行验证管道...
app.directive('list', function (){
return {
restrict: "A",
require: "ngModel",
priority: 100,
link: function(scope, elem, attr, ngModel){
var list;
scope.$watch(function () {
return $parse(attrs.list)(scope);
}, function () {
ngModel.$validate();
});
//For DOM -> model validation
ngModel.$validators.list = function(value){
if(!list){
var options = document.getElementById(attr.list).options;
var list = [];
for(var i=options.length-1; i>=0; i--){
if(isString(options[i].getAttribute("valid"))){
if(options[i].label){list.push(options[i].label.toLowerCase())}
if(options[i].value){list.push(options[i].value.toLowerCase())}
}
};
}
var valid = (value||!value==""?list.indexOf(value.toLowerCase()) !== -1:true);
return (!list.length)||valid;
};
}
};
});
你真的需要阅读这个关于如何"在角度中思考"的SO问题。
在某处,您有一个<datalist>
,您通过 list
属性将其 id 传递给您的指令。我想这很接近你所拥有的:
<datalist id="myDatalist">
<options ng-repeat="item in items" value="{{item.value}}">{{item.label}}</options>
</datalist>
<input ng-model="foo" list="myDatalist">
不要尝试从<options>
元素或 DOM 中的其他任何位置"提取"值。您已经有$scope.items
(或您如何命名) - 使用它将其传递给您的list
指令:
.directive("list", function(){
return {
// other directive properties,
scope: {
list: "="
},
require: "ngModel",
link: function(scope, element, attrs, ngModel){
scope.$watchCollection("list", function(){
ngModel.$validate();
// do whatever else you need in response to a change in list
});
// register validators, etc...
}
}
});
然后指令的用法如下:
<input ng-model="foo" list="items">
这不仅会使用 Angular 来监视底层数据的变化,还会将您的逻辑与 DOM 分离,因此如果您决定稍后更改 ID,或者使用不带 <option>
s 的不同元素,那么您的指令不会更改。
相关文章:
- 表单级别的Anguarjs指令,访问所有字段并检查验证
- 是否有任何不需要后端的验证码角度指令
- 在 AngularJs 中验证自定义指令(我想让它成为必需的)
- 角度指令:使提交按钮指令侦听表单验证
- 在同一页面上多次使用的自定义指令 (AngularJS) 中的验证
- Angularjs - 使用自定义指令验证初始 url 值
- 角度指令验证和解密
- AngularJS通过指令重新验证提交
- 验证指令代码在ng重复中的每个项目上执行
- $render在角度1.2.2停止工作(文件验证指令)
- 在$invalid上添加验证指令并从文本框中删除数据的指令
- 通过摘要运行验证指令
- Angular 自定义验证指令在 KeyUp 事件上不显示错误
- 角度的自定义验证指令
- 自定义验证指令覆盖其他验证
- 自定义表单验证指令不传递输入数据
- blur angular JS上的异步验证指令
- 如果多个元素使用相同的自定义验证指令,如何验证表单
- 从外部访问表单验证指令
- 在AngularJS中验证指令中的字段