监控 AngularJS 指令中输入元素上的 $valid

Posted

技术标签:

【中文标题】监控 AngularJS 指令中输入元素上的 $valid【英文标题】:Monitor for $valid on input element in AngularJS directive 【发布时间】:2016-03-08 13:26:07 【问题描述】:

我有这个指令,它在每个带有add-icon-element 属性的<input> 元素之前添加一个<i> 元素。现在我要做的是观察每个<input> 元素的验证,因此当用户在其中一个元素中键入内容时,前面的<i> 元素的类将更改为fa-check green-i。我尝试通过使用attrs.$observe 来查看类何时从ng-invalid 更改为ng-valid,但它仅在DOM 结构化时触发一次,它不会对input 元素中的更改做出反应。

我做错了什么?有没有办法使用输入$valid 来做到这一点? 我看到了一些关于input 的答案,并建议将名称添加到forminput - 但是如果我需要验证多个inputs 而不仅仅是一个,我该怎么办?

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');
                
            );
        
    ;
);

这是我在 html 中的“输入”之一:

<form role="form" name="createProjectForm" class="form-validation">
    <div class="form-group">
        <label class="control-label text-center center-block" for="project.name">
                Name Your Project
        </label>
        <div class="input-icon right">
            <input type="text" placeholder="type here" name="project.name"
                ng-model="project.name" required="required" class="form-control" add-icon-element/>
        </div>
    </div>
<form>

【问题讨论】:

你的指令 html 长什么样?? @PankajParkar 是的,对不起,我添加了 html.. 【参考方案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');
                
            );
        
    ;
);

【讨论】:

感谢您的回答,但我需要将类“fa-check green-i”应用于放置在该输入之前的 标签。而且,我有多个输入,所以我需要对所有输入更通用的东西,而不是专门针对每一个输入。任何想法..? 完美答案,非常感谢!我对 Angular 很陌生,并且正在寻找 2 小时的解决方案...... :)【参考方案2】:

我认为这会为您做到: https://***.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');
               
            ); 
        
    ;
);

【讨论】:

以上是关于监控 AngularJS 指令中输入元素上的 $valid的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 指令实践指南

AngularJS无法将表单输入输入指令

每天看懂一点:AngularJS

AngularJs 指令

AngularJs 指令

vue常用14个指令