5

我有以下 html/angular

<input type="email" data-ng-model="myEmailVar" />
{{ myEmailVar }}

现在的问题是 Angular 有一个用于电子邮件的自动验证器,除非它正确通过,否则它不会设置 myEmailVar。因此,例如,如果我输入“名称”,则不会设置 myEmailVar。你可以在这里看到它:http: //jsfiddle.net/bFVsW/(输入单词test,然后输入test@test.test)

现在,我想运行自己的验证,但也支持移动。如果我使用 type="email" 某些移动浏览器会切换键盘布局以更轻松地输入地址(例如 @ 符号)。所以我无法将其切换为 type="text"。我想做的是覆盖角度电子邮件验证器,或者完全关闭它,因为我将处理我自己的验证。那可能吗?

4

4 回答 4

5

在 HTML5 上,您可以使用表单的属性 novalidate 来禁用浏览器的验证:

<form novalidate>
    <input type="email"/>
</form>

或者你可以使用type="text"

于 2013-06-25T08:32:05.907 回答
1

对于仍在寻找答案的任何人,我在此堆栈溢出答案中找到了答案:如何禁用 angulars type=email 验证?

本质上,您可以添加自己的自定义指令来禁用默认的角度验证器。

angular.module('app').directive('disableValidators', function() {
    return {
        require: 'ngModel',
        link: function(scope, elm, attrs, ctrl){
            var validator = function(value){
                return value;
            };

            // replace other validators with our own
            ctrl.$parsers = [validator];
            ctrl.$formatters = [validator];
        }
    }
});

同一线程中的另一个答案提供了更详细的答案:如何禁用 angulars type=email 验证?

编辑:这个解决方案过去对我有用,但当我从 angular 1.2.X 升级到 1.3.X 时不再有效。但是,它可以通过一些小的调整来工作:

angular.module('app').directive('disableValidators', function() {
    return {
        require: 'ngModel',
        link: function(scope, elm, attrs, ctrl) {
            var validator = function(value) {
                return value;
            };

            // replace the email validators
            ctrl.$validators = {email: validator};
        }
    }
});
于 2014-07-10T23:04:07.090 回答
0

更新:这不起作用......至少不是你想要的方式。将 ng-non-bindable 添加到表单或任何输入都会中断所有绑定。因此,输入中的 ng-model 将不再起作用。对不起 ....

ng-non-bindable 是这个问题的答案。在这里查看我的答案:

https://stackoverflow.com/a/19387233/75644

于 2013-10-15T17:26:00.127 回答
-3

简单的解决方案:使用类型初始化字段并将类型'text'更改为'email'超时。在这种情况下,angularjs 不会添加电子邮件验证器,您将拥有电子邮件键盘。

<input type="{{type}}" />

$scope.type = 'text';  
$timeout(function() { 
    $scope.type = 'email'; 
});

http://jsfiddle.net/44pc5j8L/

于 2014-08-21T12:07:08.120 回答