Eu tenho um formulário no Angular que possui duas tags de botões. Um botão envia o formulário ng-click
. O outro botão é apenas para navegação usando ng-click
. No entanto, quando esse segundo botão é clicado, o AngularJS está causando uma atualização de página que aciona um 404. Soltei um ponto de interrupção na função e está acionando a minha função. Se eu fizer qualquer um dos seguintes, ele será interrompido:
- Se eu remover
ng-click
, o botão não causará uma atualização da página. - Se eu comentar o código na função, ele não causará uma atualização da página.
- Se eu alterar a tag button para uma tag anchor (
<a>
) comhref=""
, isso não causará uma atualização.
A última parece ser a solução mais simples, mas por que o AngularJS está executando algum código após a minha função que faz com que a página seja recarregada? Parece um bug.
Aqui está o formulário:
<form class="form-horizontal" name="myProfile" ng-switch-when="profile">
<fieldset>
<div class="control-group">
<label class="control-label" for="passwordButton">Password</label>
<div class="controls">
<button id="passwordButton" class="secondaryButton" ng-click="showChangePassword()">Change</button>
</div>
</div>
<div class="buttonBar">
<button id="saveProfileButton" class="primaryButton" ng-click="saveUser()">Save</button>
</div>
</fieldset>
</form>
Aqui está o método do controlador:
$scope.showChangePassword = function() {
$scope.selectedLink = "changePassword";
};
javascript
angularjs
chubbsondubs
fonte
fonte
Respostas:
Se você der uma olhada na especificação do W3C , parece que o mais óbvio é tentar marcar os elementos do botão com
type='button'
quando você não deseja que eles enviem.O que deve ser observado em particular é onde diz
fonte
$event.preventDefault()
, que ajudou no meu caso. Mas não tenho explicação porque: - \Você pode tentar impedir o manipulador padrão:
html:
js:
fonte
Você deve declarar o atributo
ng-submit={expression}
em seu<form>
tag.Nos documentos do ngSubmit, http://docs.angularjs.org/api/ng.directive:ngSubmit
fonte
Eu uso a diretiva para impedir o comportamento padrão:
E então, em html:
Esta diretiva também pode ser usada com
<a>
e todas as outras tagsfonte
<form>
tag e, portanto, não pode usar ang-submit
diretiva.Você pode manter
<button type="submit">
, mas deve remover o atributoaction=""
de<form>
.fonte
Eu me pergunto por que ninguém propôs a solução possivelmente mais simples:
A
<whatever ng-form>
IMHO faz um trabalho melhor e sem um formulário HTML, não há nada a ser enviado pelo próprio navegador. Qual é exatamente o comportamento certo ao usar o angular.fonte
ng-form=someForm
você consegue$scope.someForm
e tem um$valid
campo. Então, eu tenho tudo o que preciso<button ng-disabled="!someForm.$valid">
.Adicione ação ao seu formulário.
<form action="#">
fonte
Esta resposta pode não estar diretamente relacionada à pergunta. É apenas o caso quando você envia o formulário usando scripts.
De acordo com o código ng-submit
Ele adiciona o ouvinte de eventos de envio no formulário. Mas o manipulador de eventos de envio não seria chamado quando o envio for iniciado chamando form.submit (). Nesse caso, o ng-submit não impedirá a ação padrão; você deve chamar preventDefault você mesmo no manipulador do ng-submit;
Consulte O formulário enviado usando submit () de um link não pode ser capturado pelo manipulador de envio
fonte
O primeiro botão envia o formulário e o segundo não
fonte
Basta adicionar o arquivo
FormsModule
naimports
matrizapp.module.ts
e adicionarimport { FormsModule } from '@angular/forms';
no topo deste arquivo ... isso funcionará.fonte