在 AngularJS 中使用指令时如何使表单无效
How to invalidate a form when using directive in AngularJS
我正在开发一个 SPA,此应用程序中的一个表单使用了一个输入屏蔽文本框,该文本框是使用来自 here
的第三方库实现的
我创建了一个指令来为 IP 地址设置掩码
angular
.module('app').directive('ipMask', [
function () {
return {
restrict: 'A',
require: '?ngModel',
link: function (scope, element, attrs, ngModel) {
element.mask('0ZZ.0ZZ.0ZZ.0ZZ', {translation: {'Z': {pattern: /[0-9]/, optional: true}}});
element.mask('099.099.099.099');
scope.$watch(attrs.ngModel, function (newValue, oldValue) {
//????????
});
}
};
}
]);
我的表单代码看起来像
<div ng-controller="nodesListCtrl as vm">
<form role="form" name="frmNode">
<div class="form-group">
<label>Node IP :</label>
<input type="text" data-ip-mask ng-model="vm.myIp" name="CtrIp" class="input-sm form-control" placeholder="..." >
</div>
</form>
</div>
如果 IP 地址错误,我想使表格无效。即我期待 .ng-invalid class 在表单和控件上,直到它仍然无效。有什么建议么 ?
您不需要使用 $watch
。只需添加一个解析器 and/or 格式化程序。视图更改时调用解析器,模型更改时调用格式化程序。 (这个 link 可以告诉你更多关于这些的信息,以及 ngModelController 上可用的其他东西:https://docs.angularjs.org/api/ng/type/ngModel.NgModelController)。这是一个例子:
link: function (scope, element, attrs, ngModel) {
element.mask('0ZZ.0ZZ.0ZZ.0ZZ', {translation: {'Z': {pattern: /[0-9]/, optional: true}}});
element.mask('099.099.099.099');
ngModel.$parsers.unshift(function(value) {
var valid = isValid(value); // made up - use whatever validation technique based on that library
ngModel.$setValidity('ip', valid);
return valid;
});
ngModel.$formatters.unshift(function(value) {
var valid = isValid(value);
ngModel.$setValidity('ip', valid);
return valid ? value : undefined;
});
}
我正在开发一个 SPA,此应用程序中的一个表单使用了一个输入屏蔽文本框,该文本框是使用来自 here
的第三方库实现的我创建了一个指令来为 IP 地址设置掩码
angular
.module('app').directive('ipMask', [
function () {
return {
restrict: 'A',
require: '?ngModel',
link: function (scope, element, attrs, ngModel) {
element.mask('0ZZ.0ZZ.0ZZ.0ZZ', {translation: {'Z': {pattern: /[0-9]/, optional: true}}});
element.mask('099.099.099.099');
scope.$watch(attrs.ngModel, function (newValue, oldValue) {
//????????
});
}
};
}
]);
我的表单代码看起来像
<div ng-controller="nodesListCtrl as vm">
<form role="form" name="frmNode">
<div class="form-group">
<label>Node IP :</label>
<input type="text" data-ip-mask ng-model="vm.myIp" name="CtrIp" class="input-sm form-control" placeholder="..." >
</div>
</form>
</div>
如果 IP 地址错误,我想使表格无效。即我期待 .ng-invalid class 在表单和控件上,直到它仍然无效。有什么建议么 ?
您不需要使用 $watch
。只需添加一个解析器 and/or 格式化程序。视图更改时调用解析器,模型更改时调用格式化程序。 (这个 link 可以告诉你更多关于这些的信息,以及 ngModelController 上可用的其他东西:https://docs.angularjs.org/api/ng/type/ngModel.NgModelController)。这是一个例子:
link: function (scope, element, attrs, ngModel) {
element.mask('0ZZ.0ZZ.0ZZ.0ZZ', {translation: {'Z': {pattern: /[0-9]/, optional: true}}});
element.mask('099.099.099.099');
ngModel.$parsers.unshift(function(value) {
var valid = isValid(value); // made up - use whatever validation technique based on that library
ngModel.$setValidity('ip', valid);
return valid;
});
ngModel.$formatters.unshift(function(value) {
var valid = isValid(value);
ngModel.$setValidity('ip', valid);
return valid ? value : undefined;
});
}