如何在自定义angular指令中添加/设置验证(require, prestine等)
How to add/set validations (require, prestine etc) on custom angular directives
我已经创建了一个angular指令,如下所示:
angular.module('SharedModule')
.directive('multiSelect', ['$ionicModal', multiSelect]);
function multiSelect($ionicModal) {
return {
restrict: 'E',
template: [
'<div ng-click="showItems($event)" class="item-icon-right item">',
'{{text}}',
'<i class="icon ion-ios-arrow-right"></i>',
'</div>'
].join(""),
scope: {
'items': '=',
'value': '=ngModel'
},
link: function (scope, element, attrs, $filter) {
//validations
//if (typeof attrs.required != "undefined"){
// // a value is required, hence invalidate this control.
//
//}
//Some specific logic here.
scope.validate = function () {
// validation that kicks in when user chooses to close the modal.
};
scope.$on('$destroy', function () {
scope.modal.remove();
});
}
}
}
这基本上是给用户一个选项,从ionic应用中使用的模态对话框中选择多个联系人类型。
我使用这个指令在我的html(在一个表单中)如下:
<multi-select
name="contactTypes"
items="contact_types"
text="Contact types"
header-text="Choose contact types"
allow-empty="false"
ng-model="contact.contact_types"
></multi-select>
问题:如果用户没有选择任何东西,我不知道如何设置ng-pristine,ng-required,ng- unchanged类。管理自定义验证的代码放在哪里?我需要做些什么,这样我就可以使用这个指令作为任何其他输入控制与ng-model?
您将不得不与ng-model
进行交互,如这里所述(特别是在"自定义控件示例"下)。总结:
-
首先要求
ngModel
:function multiSelect($ionicModal) { return { ... require: 'ngModel', ... }; }
-
在
link
函数中得到ngModel
并重新定义$isEmpty
。默认值为undefined
、''
、null
或NaN
。您可能希望将空数组添加到此检查中,例如:link: function(scope, element, attrs, ngModel) { ... var originalIsEmpty = ngModel.$isEmpty; ngModel.$isEmpty = function(value) { return originalIsEmpty.call(ngModel, value) || value.length === 0; }; ... }
-
完成后,您只需要将
ng-required
添加到您的指令:<multi-select ... ng-required="true"></multi-select>
Angular将调用你自己的
$isEmpty
实现,并将ng-invalid-required
类添加到<multi-select>
元素中。
$pristine
和$untouched
可以开箱即用。如果没有,则必须添加调用ngModel
的适当方法的代码:
- 每当用户打开对话框-控件被触摸时,执行
ngModel.$setTouched()
。 - 每当用户在和对话框中按下"OK"时,就会进行实际更改-控制值已经更改,它不再是原始的,执行
ngModel.$setDirty()
。
顺便说一下,在link
函数中访问ngModel
使得scope: { 'value': '=ngModel' }
是多余的。
相关文章:
- 正在验证8个真/假复选框或复选框中的2个
- 借助asp.net验证或java脚本对多个文本进行验证
- jQuery自定义验证比较多个输入的序列
- 使用html中的外部javascript进行数据验证
- 如何使用jquery Validation验证Formspread
- jquery中的文本框验证
- 在验证和发送邮件后更改联系人表单的 html
- 代码不会验证
- JS验证ajax返回的html中的表单数据
- 同步调用,直到用户通过angular验证为访问者
- 带有加号的电话号码验证(可选)
- 解析javascript表单验证器
- 两位数的月份日期验证
- 使用angularjs验证文本框中的电子邮件
- 验证Javascript中的Textarea
- 使用regex的jquery keydown绑定不会验证撇号和句点
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- 正在删除node.js中已验证的网站
- 如何在自定义angular指令中添加/设置验证(require, prestine等)
- 奇怪的骨干.与require.js和backbone.stickit一起使用时的验证错误