Ho appena incontrato uno strano comportamento da Angular:Quando il nome di direttiva angolare è importante
Ecco lo scenario:
un modulo di registrazione, voglio verificare la presenza di unicità e-mail (attraverso un call http al server).
Così, ho creato una direttiva denominata emailUnique
il cui codice cliente è:
<form name="form" novalidate>
<!-- some other fields -->
<input name="email" type="email" ng-model="user.email" required email-unique/>
</form>
Per il resto del post, supponiamo che l'utente sta scrivendo: michael
, che non è chiaramente una mail valido.
Diamo uno sguardo alla parte interessante del mio codice direttiva, innescando il comportamento Sono interessato a:
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
});
}
};
});
Prima di dare la risposta, a prima vista, la risposta sarebbe logicamente:
undefined
Perché? Perché:
- Abbiamo precisa l'attributo
type="email"
e non semplicementetype="text"
michael
non è una mail valido.- Il compilatore di Angular si suppone che sia conforme al classico comportamento HTML.
Dopo averlo provato, la risposta è undefined
come previsto. La logica della mia direttiva completa sarà basata su questo e l'intero funziona bene.
Ora, rinominiamo la direttiva: emailUnique
diventa somethingUnique
.
Cliente essendo ora:
<input name="email" type="email" ng-model="user.email" required something-unique/>
Sorpresa: il console.log(viewValue)
è ora visualizzato: michael
, non undefined
...
Chiaramente, a partire email
per il nome ha un effetto strano quando si tratta di un campo di e-mail in questo caso.
La mia domanda è semplice: C'è una buona ragione? Un bug possibile? Potrei fraintendere qualche nozione?
Alcuni ulteriori precisazioni:
- Il Angular's documentation merito campo Email con angolare non presenta alcuni
email
attributo che potrebbero interferire conemail-unique
. Infatti, è basato sutype="email"
- Mi sono imbattuto nello stesso problema se l'attributo
novalidate
del modulo è presente o meno.
Ecco un plunkr che ho appena creato per mostrare il problema: http://plnkr.co/edit/T9YfiDr5IU5vOrMtggY3?p=preview – Mik378