2013-05-31 18 views
7

ho un modulo di iscrizione per un'applicazione, e js angolari è responsabile per la sua validazione.angolare JS Email di convalida con caratteri unicode

mi sono imbattuto in un problema quando js angolari non accettava un indirizzo email che ha l'apostrofo in esso. "Pear'[email protected]".

ho scoperto che angularJs doesnt come caratteri Unicode in indirizzo di posta elettronica.

Ha chiunque altro sono imbattuto in un problema come questo, io sono interessato a conoscere le mie opzioni di farla franca con questo bug in angularJs.

Qualsiasi input è apprezzato. Grazie !

+1

Hai mai pensato di scrivere una funzione di convalida personalizzata? http://jsfiddle.net/adamdbradley/Qdk5M/ – shaunhusain

risposta

17

Se avere HTML5 <input type=email /> non è critica, è possibile utilizzare <input type=text /> e la validazione del modello

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

ed è possibile utilizzare regex che @Andy Joslin ha pubblicato nella sua risposta

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

Il REGEX che hai fornito didn affrontare il problema degli apostrofi. Ho aggiunto "" "in REGEX nel file angular.js e ha funzionato. Non ho nemmeno cambiato il tipo di input in "testo". – Nanu

+0

Ho controllato la risposta, in quanto potrebbe aiutare qualcuno con problemi come questi con l'uso di ng-pattern. – Nanu

+0

Quando si utilizza questa espressione direttamente nel modello ng senza una variabile, il '\ .' deve essere sfuggito due volte poiché è un'espressione ENTRO una stringa. '\\.' – Soviut

11

AngularJS utilizza questa espressione regolare per e-mail di prova: https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L4

Che cosa si potrebbe fare è scrivere una direttiva che controlla da soli. Basta copiare quello da AngularJS e utilizzare il proprio regexp: 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); 
    } 
    }; 
}); 

Poi si può solo fare:

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

In alternativa si può semplicemente utilizzare '' – vittore

1

Ho appena aggiornato la regex nel file angular.js (aggiunto "'" nell'espressione) e ha funzionato, senza apportare altre modifiche.

EMAIL_REGEXP = /^[A-Za-z0-9._%+- '] + @ [A-Za-z0-9 .-] +. [A-Za-z] {2, 4} $ /. Grazie Vittore, per avermi dato l'idea di aggiornare REGEX. :)

0

perché si restituisce undefined?

refactoring della funzione:

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

angolare non supportano l'apostrofo (') in email Id. Se è necessario per convalidare l'apostrofo in angolare, è necessario modificare l'espressione regolare da:

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

A:

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

E funzionerà perfettamente.