我有这个指令,在每个具有<i>
属性的<input>
元素之前添加add-icon-element
元素。现在我要做的是观察每个<input>
元素的验证,因此当用户在其中一个元素中键入内容时,前面的<i>
元素的类将更改为{{ 1}}。我尝试使用fa-check green-i
来查看班级何时从attrs.$observe
更改为ng-invalid
,但只有一次在DOM结构化时触发,它不会对ng-valid
元素中的更改。
我做错了什么?有没有办法使用输入input
来做到这一点?
我看到了一个$valid
的答案,其中包含了向input
和form
添加名称的建议 - 但如果我需要验证多个input
,我该怎么办?不只是一个?
inputs
这是我的一个输入&#39;在html中:
angular.module('mean.theme')
.directive("addIconElement", function () {
return {
restrict: 'EA',
link: function (scope, inputElement, attrs) {
var $icon = $('<i class="fa"></i>');
inputElement.before($icon);
attrs.$observe('class', function(val){
if (val.indexOf("ng-valid") >= 0) {
inputElement.prev().addClass('fa-check green-i');
}
});
}
};
});
答案 0 :(得分:1)
您不需要为此类案例创建指令,您可以使用ng-class
指令实现此目的,只需将您的字段名称从name="project.name"
更改为name="project_name"
<div class="input-icon right">
<input type="text" placeholder="type here" name="project.name"
ng-class="{'fa-check green-i': createProjectForm.project_name.$valid}"
ng-model="project.name" required="required"
class="form-control"/>
</div>
<强>更新强>
要使其成为通用方式,您需要在该元素上使用require
ngModel指令,这样您就可以访问ngModelController
。
angular.module('mean.theme')
.directive("addIconElement", function () {
return {
restrict: 'EA',
require: 'ngModel', //require to get access to `ngModelController`
link: function (scope, inputElement, attrs, ngModelCtrl) {
var $icon = $('<i class="fa"></i>');
inputElement.before($icon);
scope.$watch(function(){
return ngModelCtrl.$valid; //made watch on field validation.
}, function(val){
if (val.indexOf("ng-valid") >= 0) {
inputElement.prev().addClass('fa-check green-i');
}
});
}
};
});
答案 1 :(得分:1)
我认为这会为你做到: https://stackoverflow.com/a/23871934/1636157
angular.module('mean.theme')
.directive("addIconElement", function () {
return {
restrict: 'EA',
require: '^form',
link: function (scope, inputElement, attrs, ctrl) {
var $icon = $('<i class="fa"></i>');
inputElement.before($icon);
scope.$watch(ctrl.$name + '.' + inputElement.attr('name') + '.$valid', function (valid) {
if(valid) {
inputElement.prev().addClass('fa-check green-i');
} else {
inputElement.prev().removeClass('fa-check green-i');
}
});
}
};
});