Estoy escribiendo un formulario de inicio de sesión simple usando angularjs con alguna validación de entrada del lado del cliente para verificar que el nombre de usuario y la contraseña no estén vacíos y tengan más de tres caracteres. Ver el siguiente código:
<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>
Y el controlador:
var controller = function($scope) {
$scope.login = {
submit: function() {
Console.info($scope.login.username + ' ' + $scope.login.password);
}
}
};
El problema es que login.submit
se llamará a la función incluso si la entrada no es válida. ¿Es posible prevenir este comportamiento?
Como nota al margen, puedo mencionar que también uso bootstrap y requirejs.
angularjs
validation
Runar Halse
fuente
fuente
Respuestas:
Tu puedes hacer:
No hay necesidad de verificaciones del controlador.
fuente
&&
haber intentado pasar el valor como parte del envío y confirmado que el valor en sí mismo es "falso"Cambie el botón de enviar a:
fuente
Entonces, la respuesta sugerida de TheHippo no funcionó para mí, en cambio terminé enviando el formulario como un parámetro a la función de esta manera:
Esto hace que el formulario esté disponible en el método del controlador:
fuente
Sus formularios se colocan automáticamente en $ scope como un objeto. Se puede acceder a través de
$scope[formName]
A continuación se muestra un ejemplo que funcionará con su configuración original y sin tener que pasar el formulario como parámetro en ng-submit.
Ejemplo de trabajo: http://plnkr.co/edit/BEWnrP?p=preview
fuente
if(this.loginform.$invalid)
... en su lugar, pero luego, en el HTML, debe darle el nombre al formulario<form name="ctrl.loginform" ..
. Y eso es asumiendo que está usando<div ng-controller="controller as ctrl"..
en su sintaxis de controlador. Gracias @JoshCarollHTML:
En tu controlador:
fuente
event.preventDefault()
es el camino a seguir, detener el envío del formulario.Aunque no es una solución directa para la pregunta de los OP, si su formulario está dentro de un
ng-app
contexto, pero desea que Angular lo ignore por completo, puede hacerlo explícitamente utilizando langNonBindable
directiva:fuente
Solo para agregar a las respuestas anteriores,
Estaba teniendo 2 botones regulares como se muestra a continuación. (Sin tipo = "enviar" en cualquier lugar)
No importa cuánto lo intente, presionando enter una vez que el formulario fue válido , se llamó al botón "Borrar formulario", borrando todo el formulario.
Como solución alternativa,
Tuve que agregar un botón de envío ficticio que estaba deshabilitado y oculto. Y este botón ficticio tenía que estar encima de todos los demás botones como se muestra a continuación .
Bueno, mi intención nunca fue presentar en Enter, por lo que el truco dado anteriormente funciona bien.
fuente
Sé que este es un hilo viejo pero pensé que también haría una contribución. Mi solución es similar a la publicación ya marcada como respuesta. Algunas comprobaciones de JavaScript en línea hacen el truco.
fuente
Sé que es tarde y me respondieron, pero me gustaría compartir las cosas interesantes que hice. Creé una directiva ng-validate que engancha el envío del formulario, luego emite prevent-default si $ eval es falso:
En tu html:
fuente