Tengo un formulario en Angular que tiene dos etiquetas de botones. Un botón envía el formulario ng-click
. El otro botón es solo para navegación ng-click
. Sin embargo, cuando se hace clic en este segundo botón, AngularJS está causando una actualización de la página que activa un 404. He dejado caer un punto de interrupción en la función y está activando mi función. Si hago algo de lo siguiente, se detiene:
- Si elimino el
ng-click
, el botón no causa una actualización de la página. - Si comento el código en la función, no se actualiza la página.
- Si cambio la etiqueta del botón a una etiqueta de anclaje (
<a>
) conhref=""
, entonces no causa una actualización.
Esta última parece ser la solución más simple, pero ¿por qué AngularJS incluso ejecuta algún código después de mi función que hace que la página se vuelva a cargar? Parece un error.
Aquí está la forma:
<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>
Aquí está el método del controlador:
$scope.showChangePassword = function() {
$scope.selectedLink = "changePassword";
};
javascript
angularjs
chubbsondubs
fuente
fuente
Respuestas:
Si echa un vistazo a la especificación W3C , parece que lo más obvio es marcar los elementos de su botón
type='button'
cuando no desea que se envíen.Lo que hay que tener en cuenta en particular es dónde dice
fuente
$event.preventDefault()
, eso ayudó en mi caso. Pero no tengo explicaciones de por qué: - \Puede intentar evitar el controlador predeterminado:
html:
js:
fuente
Debe declarar el atributo
ng-submit={expression}
en su<form>
etiqueta.De los documentos de ngSubmit http://docs.angularjs.org/api/ng.directive:ngSubmit
fuente
Yo uso la directiva para evitar el comportamiento predeterminado:
Y luego, en html:
Esta directiva también se puede usar con
<a>
y todas las demás etiquetasfuente
<form>
etiqueta y, por lo tanto, no puede usar lang-submit
directiva.Puede mantener
<button type="submit">
, pero debe eliminar el atributoaction=""
de<form>
.fuente
Me pregunto por qué nadie propuso la solución posiblemente más simple:
A
<whatever ng-form>
IMHO hace un mejor trabajo y sin un formulario HTML, no hay nada que enviar el navegador en sí. Cuál es exactamente el comportamiento correcto cuando se usa angular.fuente
ng-form=someForm
, obtienes$scope.someForm
y tiene un$valid
campo. Entonces consigo todo lo que necesito<button ng-disabled="!someForm.$valid">
.Agregue acción a su formulario.
<form action="#">
fuente
Es posible que esta respuesta no esté directamente relacionada con la pregunta. Es solo para el caso cuando envía el formulario utilizando scripts.
De acuerdo con el código ng-submit
Agrega el detector de eventos de envío en el formulario. Pero el controlador de eventos de envío no se llamará cuando el envío se inicia llamando a form.submit (). En este caso, ng-submit no impedirá la acción predeterminada, debe llamar a preventDefault usted mismo en el controlador ng-submit;
Ver formulario enviado usando submit () desde un enlace no puede ser capturado por el controlador de envío
fuente
El primer botón envía el formulario y el segundo no
fuente
Simplemente agregue el
FormsModule
en laimports
matriz deapp.module.ts
archivos y agregueimport { FormsModule } from '@angular/forms';
en la parte superior de este archivo ... esto funcionará.fuente