【发布时间】:2014-01-05 13:24:25
【问题描述】:
我刚刚遇到 Angular 的一个奇怪行为:
场景如下:
在注册表单中,我想检查电子邮件的唯一性(通过对服务器的 http 调用)。
因此,我创建了一个名为 emailUnique 的指令,其客户端代码为:
<form name="form" novalidate>
<!-- some other fields -->
<input name="email" type="email" ng-model="user.email" required email-unique/>
</form>
对于帖子的其余部分,假设用户正在输入:michael,这显然不是有效的邮件。
让我们看看我的指令代码中有趣的部分,触发了我感兴趣的行为:
angular.module('directives.emailUnique', [])
.directive('emailUnique', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, el, attrs, ctrl) {
ctrl.$parsers.push(function (viewValue) {
console.log(viewValue); //What do you expect here for viewValue? answer below
});
}
};
});
在给出答案之前,乍一看,逻辑上的反应是:
undefined
为什么?因为:
- 我们精确到
type="email"属性,而不仅仅是type="text" -
michael不是有效的邮件。 - Angular 的编译器应该符合经典的 HTML 行为。
经过测试,答案是undefined,符合预期。我的完整指令的逻辑将基于此,整个工作正常。
现在,让我们重命名指令:emailUnique 变为 somethingUnique。
现在的客户:
<input name="email" type="email" ng-model="user.email" required something-unique/>
惊喜:console.log(viewValue) 现在显示的是:michael,而不是 undefined ...
显然,在这种情况下,以email 开头的名称在处理电子邮件字段时会产生奇怪的效果。
我的问题很简单:有充分的理由吗?一个可能的错误?我可能会误解某些概念吗?
一些进一步的精度:
-
Angular's documentation about 带有角度的电子邮件字段不存在可能干扰
email-unique的某些email属性。事实上,它基于type="email" - 无论表单的
novalidate属性是否存在,我都遇到了同样的问题。
【问题讨论】:
-
这是我刚刚用来说明问题的一个 plunkr:plnkr.co/edit/T9YfiDr5IU5vOrMtggY3?p=preview
标签: javascript html forms angularjs angularjs-directive