Estou escrevendo um formulário de login simples usando angularjs com alguma validação de entrada do lado do cliente para verificar se o nome de usuário e a senha não estão vazios e têm mais de três caracteres. Veja o código abaixo:
<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>
E o controlador:
var controller = function($scope) {
$scope.login = {
submit: function() {
Console.info($scope.login.username + ' ' + $scope.login.password);
}
}
};
O problema é que a login.submit
função será chamada mesmo que a entrada não seja válida. É possível evitar esse comportamento?
Como observação, posso mencionar que eu também uso o bootstrap e o requirejs.
angularjs
validation
Runar Halse
fonte
fonte
Respostas:
Você pode fazer:
Não há necessidade de verificações do controlador.
fonte
&&
eu tentei passar o valor como parte do envio e confirmei que o valor em si é "falso"Altere o botão enviar para:
fonte
Portanto, a resposta sugerida pelo TheHippo não funcionou para mim; acabei enviando o formulário como parâmetro para a função da seguinte maneira:
Isso disponibiliza o formulário no método do controlador:
fonte
Seus formulários são automaticamente colocados em $ scope como um objeto. Pode ser acessado via
$scope[formName]
Abaixo está um exemplo que funcionará com sua configuração original e sem a necessidade de passar o próprio formulário como parâmetro no ng-submit.
Exemplo de trabalho: http://plnkr.co/edit/BEWnrP?p=preview
fonte
if(this.loginform.$invalid)
.. em vez disso, mas no HTML você deve dar o nome ao formulário<form name="ctrl.loginform" ..
. E isso assumindo que você esteja usando<div ng-controller="controller as ctrl"..
em seu controlador como sintaxe. Obrigado @JoshCarollHTML:
No seu controlador:
fonte
event.preventDefault()
é o caminho a seguir, para interromper o envio do formulário.Embora não seja uma solução direta para a questão dos OPs, se seu formulário estiver dentro de um
ng-app
contexto, mas você desejar que o Angular o ignore completamente, faça isso explicitamente usando angNonBindable
diretiva:fonte
Apenas para adicionar às respostas acima,
Eu estava usando dois botões regulares, como mostrado abaixo. (Nenhum tipo = "enviar" em qualquer lugar)
Não importa o quanto tentei, pressionando enter uma vez que o formulário era válido , o botão "Limpar formulário" foi chamado, limpando todo o formulário.
Como solução alternativa,
Eu tive que adicionar um botão de envio fictício que estava desativado e oculto. E esse botão fictício tinha que estar em cima de todos os outros botões, como mostrado abaixo .
Bem, minha intenção nunca foi enviar no Enter, então o hack fornecido acima funciona bem.
fonte
Sei que esse é um tópico antigo, mas pensei em fazer uma contribuição. Minha solução sendo semelhante à postagem já marcada como resposta. Algumas verificações de JavaScript embutidas são suficientes.
fonte
Sei que é tarde e fui atendida, mas gostaria de compartilhar as coisas legais que fiz. Criei uma diretiva ng-validate que conecta o envio do formulário e, em seguida, emite prevent-default se o $ eval for falso:
No seu html:
fonte