Piszę prosty formularz logowania za pomocą angularjs z pewną weryfikacją danych wejściowych po stronie klienta, aby sprawdzić, czy nazwa użytkownika i hasło nie są puste i nie są dłuższe niż trzy znaki. Zobacz poniższy kod:
<form name="loginform" novalidate ng-submit="login.submit()" class="css-form">
<fieldset>
<div class="control-group input-prepend">
<span class="add-on"><i class="icon-user"></i></span>
<input type="text" ng-model="login.username" name="username" required ng-minlength="3" placeholder="username" />
</div>
<div class="control-group input-prepend">
<span class="add-on"><i class="icon-lock"></i></span>
<input type="password" ng-model="login.password" name="password" required ng-minlength="3" placeholder="" />
</div>
<div class="control-group">
<input class="btn" type="submit" value="Log in">
</div>
</fieldset>
</form>
A kontroler:
var controller = function($scope) {
$scope.login = {
submit: function() {
Console.info($scope.login.username + ' ' + $scope.login.password);
}
}
};
Problem polega na tym, że login.submit
funkcja zostanie wywołana, nawet jeśli dane wejściowe będą nieprawidłowe. Czy można temu zapobiec?
Na marginesie mogę wspomnieć, że używam również bootstrap i requirejs.
angularjs
validation
Runar Halse
źródło
źródło
Odpowiedzi:
Możesz to zrobić:
Nie ma potrzeby sprawdzania kontrolera.
źródło
&&
jak próbowałem przekazać wartość w ramach przesyłania i potwierdziłem, że sama wartość jest „fałszywa”Zmień przycisk przesyłania na:
źródło
Więc sugerowana odpowiedź z TheHippo nie zadziałała dla mnie, zamiast tego wysłałem formularz jako parametr do funkcji takiej jak:
Dzięki temu formularz jest dostępny w metodzie kontrolera:
źródło
Twoje formularze są automatycznie umieszczane w $ scope jako obiekt. Dostęp do niego można uzyskać za pośrednictwem
$scope[formName]
Poniżej znajduje się przykład, który będzie działał z oryginalną konfiguracją i bez konieczności przekazywania samego formularza jako parametru w ng-submit.
Przykład roboczy: http://plnkr.co/edit/BEWnrP?p=preview
źródło
if(this.loginform.$invalid)
.., ale wtedy w kodzie HTML musisz nadać formularzowi nazwę<form name="ctrl.loginform" ..
. I to przy założeniu, że używasz<div ng-controller="controller as ctrl"..
w składni kontrolera jako. Dzięki @JoshCarollHTML:
W kontrolerze:
źródło
event.preventDefault()
, najlepszym rozwiązaniem jest zatrzymanie przesyłania formularzy.Chociaż nie jest to bezpośrednie rozwiązanie dla pytania PO, jeśli twój formularz jest w
ng-app
kontekście, ale chcesz, aby Angular całkowicie go zignorował, możesz to zrobić bezpośrednio za pomocąngNonBindable
dyrektywy:źródło
Aby dodać do powyższych odpowiedzi,
Miałem 2 zwykłe przyciski, jak pokazano poniżej. (Nigdzie nie ma typu = „wyślij”)
Bez względu na to, jak bardzo się starałem, naciskając klawisz Enter, gdy formularz był już ważny , został wywołany przycisk „Wyczyść formularz”, który wyczyścił cały formularz.
Aby obejść ten problem,
Musiałem dodać fałszywy przycisk przesyłania, który był wyłączony i ukryty. A ten fałszywy przycisk musiał znajdować się nad wszystkimi innymi przyciskami, jak pokazano poniżej .
Cóż, moim zamiarem było nigdy nie poddawać się na Enter, więc powyższy hack działa dobrze.
źródło
Wiem, że to stary wątek, ale pomyślałem, że też będę miał swój wkład. Moje rozwiązanie jest podobne do posta już oznaczonego jako odpowiedź. Niektóre wbudowane testy JavaScript załatwiają sprawę.
źródło
Wiem, że jest późno i otrzymałem odpowiedź, ale chciałbym podzielić się zgrabnymi rzeczami, które zrobiłem. Stworzyłem dyrektywę ng-validate, która przechwytuje przy przesłaniu formularza, a następnie wysyła metodę Prevention-default, jeśli $ eval jest fałszywe:
W Twoim html:
źródło