【发布时间】:2014-02-19 10:46:57
【问题描述】:
我正在尝试创建一个指令,该指令包含一个带有 ng-model 的输入字段并知道输入控件是否有效。 (我想根据此状态更改指令内标签上的类。)我想使用 ngModelController.$valid 来检查这一点,但它总是返回 true。
formcontroller.$valid 或 formcontroller.inputfieldname.$valid 确实按预期工作,但是由于我尝试使用 formcontroller 构建可重用组件不是很方便,因为我必须确定表单的哪个字段与当前对应指示。
我不明白为什么一个有效而一个无效,因为在角度源中,管理这些状态的代码似乎是相同的:ngModelController.$setValidity 函数。
我创建了一个测试指令,其中包含一个带有必需值和最小值的数字字段。正如您在下面的小提琴中看到的那样,模型控制器仅在页面加载期间触发,之后永远不会改变。
jsfiddle with example directive
指令代码:
angular.module('ui.directives', []).directive('textboxValid',
function() {
return {
restrict: 'E',
require: ['ngModel', '^form'],
scope: {
ngModel: '='
},
template: '<input type="number" required name="somefield" min="3" ng-model="ngModel" /> '+
'<br>Form controller $valid: {{formfieldvalid}} <br> ' +
'Model controller $valid: {{modelvalid}} <br>'+
'Form controller $valid: {{formvalid}} <br>',
link: function (scope, element, attrs, controllers) {
var ngModelCtrl = controllers[0];
var formCtrl = controllers[1];
function modelvalid(){
return ngModelCtrl.$valid;
}
function formvalid(){
return formCtrl.$valid;
}
scope.$watch(formvalid, function(newVal,oldVal)
{
scope.modelvalid = ngModelCtrl.$valid;
scope.formvalid = formCtrl.$valid;
scope.formfieldvalid = formCtrl.somefield.$valid;
});
scope.$watch(modelvalid, function(newVal,oldVal)
{
scope.modelvalid = ngModelCtrl.$valid;
scope.formvalid = formCtrl.$valid;
scope.formfieldvalid = formCtrl.somefield.$valid;
//This one only gets triggered on pageload
alert('modelvalid ' + newVal );
});
}
};
}
);
有人可以帮我理解这种行为吗?
【问题讨论】:
标签: angularjs validation