2012-08-05 4 views
15

Ho un modulo che desideravo essere annidato, ma non è possibile poiché HTML non può accettare form annidati. C'è un modo per richiamare manualmente l'invio (attiva la convalida, ad es. Richiesta) sul primo modulo su AngularJS?Come attivare manualmente l'invio di un modulo in AngularJS?

Ecco come il codice è simile:

<div ng-conroller="ContactController"> 

    <form ng-submit="saveHeaderAndDetail()"> 
     <label for="Description">Description</label> 
     <input type="text" ng-model="Description" required/> 

     <input type="text" style="visibility:hidden" /> 
    </form> 

    <form ng-submit="addToDetail()"> 
    ... 
    </form> 

    <input type="button" 
     ng-click="what code could trigger the first form's submit?"/> 

</div> 

Btw, entrambe le forme sono sotto un controller se questo aiuta

+0

ng-submit lega il 'submit' evento ad un elemento .. e per quanto ne so, questo dovrebbe essere associato a un pulsante o di input [type = submit] o input [tipo = pulsante] nodo DOM, non dovrebbe? – abourget

risposta

9

Prova a creare una direttiva che cattura un evento: http://jsfiddle.net/unWF3/

+1

Il tuo codice sul pulsante che non appartiene al modulo attiva l'invio, che è buono, nuovo apprendimento per me, +1 lì. Ma non innesca la convalida su quel modulo. Vedi cosa intendevo con convalida http://jsfiddle.net/unWF3/6/ – Hao

+1

c'è un modo per farlo senza includere jquery? – Allen

4

Si può avere moduli annidati con la direttiva ng-form. Sarà come:

<form name="accountForm"> 
    <div data-ng-form="detailsForm"> 
    <input required name="name" data-ng-model="name"> 
    </div> 
    <div data-ng-form="contactsForm"> 
    <input required name="address" data-ng-model="address"> 
    </div> 
    <button type="submit">Save</button> 
</form> 

In questo modo quando submit saranno attivati ​​per la accountForm che convaliderà NG-forme annidati anche.

6

Ho risposto a una domanda simile qui AngularJS - How to trigger submit in a nested form

In sostanza, è possibile attivare la convalida sparando $validate evento

isFormValid = function($scope, ngForm) { 
    $scope.$broadcast('$validate'); 
    if(! ngForm.$invalid) { 
     return true; 
} 

Per lavorare esempio di codice & una piccola metodo di utilità che è disponibile a mostrare messaggi di convalida , vedi risposta nel link sopra.

+2

non funziona se si ha un modulo con ng-submit, un

1

Possiamo sempre inviare un modulo direttamente utilizzando la funzione invia () da javascript.

document.getElementById("myform").submit() 

In questo modo, siamo in grado di convalidare il formulario con angularjs prima e se il modulo è valido quindi inviare utilizzando il metodo di invio.

+3

Non funziona in combinazione con ng-submit. –

2

C'è un modo più semplice per farlo, puoi dare un nome per ogni modulo che hai nella tua app, quindi sarai in grado di inviare l'intero oggetto angolare del modulo che vuoi attivare o fare qualunque cosa tu vuoi con esso. Esempio:

<div ng-conroller="ContactController"> 

    <form name="myFirstForm" ng-submit="saveHeaderAndDetail()"> 
     <label for="Description">Description</label> 
     <input type="text" ng-model="Description" required/> 

     <input type="text" style="visibility:hidden" /> 
    </form> 

    <form name="mySecondForm" ng-submit="addToDetail()"> 
    ... 
    </form> 

    <input type="button" 
     ng-click="saveHeaderAndDetail(myFirstForm)"/> 

</div> 

Poi nella funzione

saveHeaderAndDetail (myFirstForm) { 
myFirstForm.$submitted = true 
... 
}