2015-05-19 10 views
5

Um die Dinge zu vereinfachen, habe ich eine Probe Form bis zu meiner Frage zu beschreiben:Warum ist ein ungültiges Formular zuerst gültig und rechts nachdem es ungültig wird?

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

Und auch ein Controller:

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

Erwartetes Ergebnis:

> false 

Tatsächliches Ergebnis:

> true 
> false 

Kann mir jemand sagen warum zuerst das Formular gültig ist und dann ungültig wird (was soll es übrigens sein)?

Working demo

+1

Wahrscheinlich während eines Digests als wahr initialisiert und später geändert, wenn es die erforderliche Eingabe erfüllt. Nur eine Spekulation. –

+0

@OmriAharon Genau das passiert, aber warum? Sollte es nicht auch bei der Initialisierung ungültig sein? – Carlos

+0

Ich würde sagen, dass, wenn es noch nicht die erforderliche Eingabe gefunden hat, es nicht wissen wird, dass es ungültig ist, da bis dahin ist es nur ein leeres Formular. Wäre aber nett wenn ich doch eine Bestätigung bekommen könnte, habe das in keiner Ressource gefunden ... –

Antwort

5

Ich bin eigentlich sicher, dass dies auf die Richtlinien Vorrang gebührt.

In angularJS <form> ist eigentlich eine Richtlinie. required ist ein anderer.

Angenommen, wir haben ein Formular ohne Validierung. Das Formular ist immer gültig. Ich bin mir ziemlich sicher, dass wir jetzt sagen können, dass ein Formular standardmäßig gültig ist.

Die "Formular" -Richtlinie hat eine höhere Priorität als "erforderlich". Es bedeutet, dass an einem Punkt. Angular wendet die "form" -Richtlinie an und nicht die "erforderliche". Dies führt zu einem gültigen Formular mit einer Eingabe mit einem unbekannten Attribut "required". Next Digest analysiert die "erforderliche" Direktive. Es stellt fest, dass die Eingabe leer ist und auf false gesetzt ist.

Wie Omri sagte, ist es eine der Prioritäts- und Digest-Zyklen der Direktiven.