2013-04-10 13 views
19

Sto costruendo un modulo che genera un invito quando inviato. L'invito ha diversi campi, uno dei quali è un input di un indirizzo e-mail con un pulsante "aggiungi", che quando viene fatto clic deve aggiungere quell'indirizzo a un elenco di indirizzi e-mail che dovrebbero ricevere l'invito.AngularJS - Come attivare l'invio in un modulo nidificato

Questo può essere fatto con un unico modulo, tuttavia se l'utente preme il tasto Invio durante la digitazione di una e-mail, quindi attiva submit sull'intero modulo. Mi piacerebbe che il risultato della chiave di invio - quando il campo di input della posta elettronica è focalizzato - abbia lo stesso effetto del pulsante "Aggiungi". Mi aspettavo che il modo corretto per risolvere questo sarebbe per nidificare il modulo di iscrizione e-mail entro il modulo di invito, qualcosa di simile:

<ng-form ng-submit="sendInvite()"> 
     <input type="text" placeholder="Title" ng-model="invitation.title"/> 

     <ng-form ng-submit="addInvitee()"> 
      <input type="email" placeholder="Title" ng-model="inviteeEmail"/> 
      <button class="btn" type="submit">add</button> 
     </ng-form> 

     <button class="btn" type="submit">Send</button> 
    </ng-form> 

Con il seguente javascript nel controller:

$scope.addInvitee = function() { 
     $scope.invitation.emails.push($scope.inviteeEmail); 
     $scope.inviteeEmail = ''; 
    } 

    $scope.sendInvite = function() { 
     //code to send out the invitation 
    } 

Il mio problema è che avere nidificato le forme (e in tal modo convertito <form>-<ng-form>, presentando uno dei due non funziona più.

Plunker here

+0

forma convalidare e o fornire un prompt di ... "Si inoltra ...." con la possibilità di annullare se non sono fatte – charlietfl

+0

Grazie, che è certamente un modo per attenuare il problema ma non è il comportamento ideale. –

+0

potrebbe anche impedire l'impostazione predefinita 'enter' quando il campo è a fuoco. Lega il gestore della chiave per mettere in campo e liberare la sfocatura. Impossibile nidificare i moduli – charlietfl

risposta

8

È possibile utilizzare uno dei seguenti due modi per specificare quali javascript metodo deve essere chiamato quando viene inviato un modulo:
* direttiva ngSubmit sull'elemento modulo
* direttiva ngClick sul primo pulsante o campo di input di tipo submit (input [type = submit])
- form docs

<ng-form> 
    <input type="text" placeholder="Title" ng-model="invitation.title"><br> 
    <ng-form> 
    <input type="email" placeholder="Title" ng-model="inviteeEmail"> 
    <button class="btn" ng-click="addInvitee()">add</button><br> 
    </ng-form> 
    <ul class="unstyled"> 
    <li ng-repeat="invitee in invitation.invitees"> 
     <span>{{invitee.email}}</span> 
    </li> 
    </ul> 
    <button class="btn" ng-click="sendInvite()">Send</button> 
</ng-form> 

Plunker

+0

Grazie, questo è un miglioramento rispetto a quello che avevo ma non risponde affatto all'evento chiave 'enter'. Dopo alcuni tentativi, sembrerebbe che gli elementi '

' e '' non siano identici a quelli della dichiarazione dei documenti. Ho [biforcato] (http://plnkr.co/edit/mssWTbMyZCTtKuq5tYDJ?p=preview) il tuo Plunker per sperimentare diverse configurazioni 'form',' ng-form' e 'ng-submit' senza alcun risultato. Hai un'idea di come potrei ottenere la risposta condizionale all'evento chiave 'enter' che ho descritto in origine? (A parte un gestore di chiavi o una direttiva personalizzata) –

+0

@JamieA, scusate mi è sfuggita la parte relativa al tasto Invio (ho tirato su il Plunker e l'ho modificato, ma ho provato solo facendo clic sui pulsanti). Penso che avrai bisogno di creare una direttiva per ottenere la funzionalità che desideri. –

+1

Il submit interno non sta facendo nulla qui. Funziona a causa del ng-clic. Angolare non sembra voler lavorare con i sottomessi sulle forme interiori. Un invio correttamente funzionante può trarre vantaggio da ng-submit. La presentazione interiore non può. –

8

I'v Requisito simile: modulo multi-step guidato dalla procedura guidata. Quando l'utente fa clic sul pulsante "Avanti", devo convalidare il modulo del passaggio corrente.

È possibile attivare la convalida attivando l'evento "$validate" sullo scope associato al modulo.

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

Quando mai voglio verificare se i valori del modulo sono corretti, che chiamerò isFormValid con l'istanza modulo ambito &.

codice di lavoro: Plunker link

E 'anche utile avere qualche logica aggiuntiva in isFormValid(incluso nel Plunker sopra) che rende i campi del modulo sotto forma & $dirty come saremmo visualizzare/nascondere messaggi di convalida basato sul loro stato $dirty.

+0

In base al codice plunker, consiglierei anche di commutare lo stato '$ pristine' in quanto non si sposta automaticamente quando si imposta il campo' $ dirty'. Buon lavoro, grazie per la soluzione! – pulkitsinghal

+0

Al momento della scrittura (AngularJS <1.2), non esiste un modo semplice per reimpostare lo stato '$ pritine'. Potremmo ripristinare lo stato 'pristine' di un particolare controllo, o un modulo. Ma abbiamo anche bisogno di propagare quella modifica se uno degli altri controlli nella sua forma o la sua forma genitore sono anche '$ pristine'. Ciò comporta molto di più. A partire da 1.2, esiste un metodo per questo: '$ setPristine (..)'. – manikanta

0

quando il modulo viene inviato, è possibile trovare tutte le forme nidificate utilizzando qualche cosa come di seguito

forms = [] 
forms.push(form) 
nestedForms = _.filter(_.values(form), (input) -> (input instanceof form.constructor) and (input not in forms)) 

Qui, forma è il controller forma esterna che è stata presentata. Puoi agganciare questo codice sul tuo onsubmit e trovare tutti i moduli annidati e fare tutto ciò che devi.

Nota: Questo è CoffeeScript

Problemi correlati