在AngularJS中有一个名为ng-messages的表单指令,它帮助我们实现它,以便不会同时显示所有表单错误 . 因此,例如,如果输入有3个错误:required,minlength,maxlength . 然后只需要显示,在需要后有效,然后显示minlength . 如果没有ng-messages,我们需要做一些非常复杂和丑陋的逻辑,以便只显示必需而不显示其余部分,同时还要考虑只有在窗体控件也脏/触摸且无效时才会显示错误 .
在AngularJS中,这将是:
<div ng-messages="form.username.$error" ng-if="form.username.$touched || form.username.$dirty">
<div ng-message="required">Please enter a username.</div>
<div ng-message="minlength">Username must be at least 3 characters.</div>
<div ng-message="maxlength">Username can't exceed 30 characters.</div>
</div>
我们怎样才能以优雅的方式在Angular中实现这一目标?
3 回答
有关可用于此目的的库,请参阅我的其他答案 . 这个答案的其余部分用于制作您自己的组件 .
下面我提供一个例子(没有编译或运行它,但它应该给你足够的信息来开始) . 只有在触摸,弄脏等时才显示消息的逻辑可以很容易地添加到此 .
Usage
Implementation
在我的另一个答案旁边,您还可以使用我创建的名为
angular-reactive-validation
的库,可以找到here .您指出在任何给定时间每个控件最多显示一条验证消息对您很重要 . 该库支持该行为 . 它还减少了您需要编写以显示验证消息的HTML数量,因为验证消息的声明将移动到您声明
FormControls
的Component
. 另一个方便的功能是通过将函数传递给Validator
来获得动态验证值 .下面我提供了一个示例表单及其背后的模型,以便您了解基本用法 .
基于@David Walschots提供的代码,我注意到它有2个问题(在我的例子中) .
它没有't validate on submit, but I didn' t想要禁用提交按钮
它没有验证模糊,只会出现错误颜色,但没有消息 .
因此,经过一段时间的尝试,我找到了一个解决方案,也适用于上述情况 .
为此,我需要为blur事件添加一个额外的监听器,并确保form would emit on submit (without creating boiler plate code) .
The extra listener
注入的
FormControl
不直接绑定到输入字段,并且没有连接到它的模糊事件 . 所以我们需要找到连接到它的html输入元素 . 为此,我们可以使用Angular提供的Renderer2
,但首先我们需要找到控件的名称,以便我们可以创建一个CSS选择器:在此之后,我们可以创建一个CSS选择器并在页面上找到该元素:
我们现在有
FormControl
绑定的HTML元素,所以我们可以添加模糊事件并用它做一些事情:当我们将此代码合并到@David Walschots的答案中时,我们得到以下代码: