2013-05-31 12 views
7

Mam formularz rejestracji dla aplikacji, a kątowa js jest odpowiedzialna za jej walidację.Angular JS Email Validation z kodami Unicode

Wpadłem na problem, gdy Angular js nie akceptował adresu e-mail z apostrofem. "Pear'[email protected]".

Dowiedziałem się, że angularJs nie odpowiada znakom Unicode w adresie e-mail.

Czy ktoś inny natknął się na taki problem, jestem zainteresowany poznaniem możliwości rozwiązania tego błędu w angularJs.

Wszelkie dane wejściowe są mile widziane. Dzięki !

+1

Czy rozważałeś napisanie niestandardowej funkcji sprawdzania poprawności? http://jsfiddle.net/adamdbradley/Qdk5M/ – shaunhusain

Odpowiedz

17

razie konieczności HTML5 <input type=email /> nie jest krytyczna, można użyć <input type=text /> i walidacji wzór

<input type="text" ng-model="field" ng-pattern="EMAIL_REGEXP" /> 

i możesz użyć wyrażenia regularnego, które @Andy Joslin opublikował w swojej odpowiedzi:

$scope.EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-][email protected][a-z0-9-]+(\.[a-z0-9-]+)*$/i; 
+0

REGEX, który podałeś nie rozwiązuje problem z apostrofem. Dodałem "" "w pliku REGEX w pliku angular.js i zadziałało. Nie zmieniłem również typu wejścia na "tekst". – Nanu

+0

Sprawdziłem twoją odpowiedź, ponieważ może to pomóc komuś w problemach takich jak te przy użyciu wzorca ng. – Nanu

+0

Używając tego wyrażenia bezpośrednio w ng-wzorca bez zmiennej, '\ .' musi zostać zmienione dwukrotnie, ponieważ jest wyrażeniem WITHIN. '\\.' – Soviut

11

angularjs używa tego wyrażenia regularnego email testu: https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L4

Co można zrobić, to napisać dyrektywę, która sprawdza się. Wystarczy skopiować jeden z angularjs i użyć własnego wyrażenia regularnego: https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L606-L614

myApp.directive('nanuEmail', function() { 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    link: function(scope, elm, attrs, model) { 
     //change this: 
     var EMAIL_REGEXP = /^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/; 
     var emailValidator = function(value) { 
     if (!value || EMAIL_REGEXP.test(value)) { 
     model.$setValidity('email', true); 
     return value; 
     } else { 
     model.$setValidity('email', false); 
     return undefined; 
     } 
     model.$parsers.push(emailValidator); 
     model.$formatters.push(emailValidator); 
    } 
    }; 
}); 

Następnie można po prostu zrobić:

<input nanu-email ng-model="userEmail"> 
+2

Alternatywnie może po prostu użyć '' – vittore

1

Właśnie zaktualizowaliśmy regex w pliku angularjs (dodanej „"”w wyrażeniu) i to działało, bez dokonywania jakichkolwiek innych zmian.

EMAIL_REGEXP = /^[A-Za-z0-9._%+- '] + @ [A-Za-Z0-9 .-] +, [A-Za-Z] {2 4} $ /. Dziękuję Vittore, za udzielenie mi pomysłu aktualizacji REGEX. :)

0

dlaczego wracasz niezdefiniowany?

Refaktoryzacja funkcji:

var verificationEmail = function (viewValue) { 
    if ((typeof viewValue != "undefined") && viewValue != "") { 
    return regex.test(viewValue); 
    } 
}; 
0

kątowa nie obsługują apostrof (') w email id. Jeśli trzeba sprawdzić poprawność apostrof w kątowa, trzeba zmienić wyrażenie regularne od:

(/^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/) 

Do:

/^[A-Za-z0-9._%+'-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/. 

będzie działać doskonale.