2015-05-19 18 views
5

Al fine di semplificare le cose ho fatto un modulo di esempio per descrivere la mia domanda:Perché un modulo non valido è valido all'inizio e subito dopo risulta non valido?

<form novalidate name="form"> 
    <input required name="foo" ng-model="my.foo"> 
</form> 

E anche un controller:

angular.module('sample', []).controller('MainController', function($scope) { 
    $scope.$watch('form.$valid', function (valid) { 
    console.log(valid); 
    }); 
}); 

Risultato atteso:

> false 

Risultato effettivo:

> true 
> false 

Qualcuno può dirmi perché inizialmente il modulo è valido e quindi non è più valido (cosa dovrebbe essere, tra l'altro)?

Working demo

+1

Inizializza probabilmente come true durante un digest e viene modificato in seguito quando soddisfa l'input richiesto. Solo una speculazione però. –

+0

@OmriAharon Questo è esattamente ciò che sta accadendo, ma perché? Non dovrebbe essere invalido anche al momento dell'inizializzazione? – Carlos

+0

Direi che se non ha ancora incontrato l'input richiesto, allora non saprà che non è valido, dal momento che ormai è solo una forma vuota. Sarebbe bello se potessi ottenere qualche conferma, non l'ho trovato in nessuna risorsa ... –

risposta

5

realtà sto sicuro che questo è dovuto alla priorità di direttive.

In angularJS <form> è in realtà una direttiva. required è un altro.

Supponiamo di avere un modulo senza convalida. Il modulo è sempre valido. Sono abbastanza sicuro che ora possiamo dire che un modulo è valido per impostazione predefinita.

La direttiva "forma" ha una priorità più alta di "richiesta". Significa che in un punto. Angolare applica la direttiva "forma" e non quella "richiesta". Questo risultato in una forma valida con un input con un attributo sconosciuto "richiesto". Il prossimo digest analizzerà la direttiva "required". Trova che l'input è vuoto e impostato valido su false.

Come ha detto Omri, è una delle priorità delle direttive e dei cicli di digestione.