2013-04-10 21 views
19

Buduję formularz, który generuje zaproszenie po przesłaniu. Zaproszenie ma kilka pól, z których jednym jest adres e-mail wprowadzany za pomocą przycisku "dodaj", który po kliknięciu powinien dodać ten adres do listy adresów e-mail, które powinny otrzymać zaproszenie.AngularJS - sposób wyzwalania przesyłania w formie zagnieżdżonej

Można to zrobić za pomocą pojedynczego formularza, jednak jeśli użytkownik wpisze klawisz Enter podczas pisania wiadomości e-mail, wywoła ona submit w całym formularzu. Chciałbym uzyskać wynik klawisza Enter - gdy pole wprowadzania adresu e-mail jest skupione - ma taki sam efekt, jak kliknięcie przycisku "Dodaj". Spodziewałem się, że właściwym sposobem rozwiązania tego byłoby gniazdo formą wejścia e-mail w postaci zaproszenia, coś takiego:

<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> 

z następującymi javascript w kontrolerze:

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

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

mój problem jest to, że po zagnieżdżać formularze (iw ten sposób przekształcony z <form> do <ng-form>, składając albo nikt już nie działa.

Plunker here

+0

forma potwierdzić i czy zapewniają wiersz ... „Przesyłasz ....” z szansą, aby anulować, jeśli nie są one wykonane – charlietfl

+0

Dzięki, że to na pewno sposób na złagodzić problem, ale nie jest to idealne zachowanie. –

+0

może również zapobiec ustawieniu wartości domyślnej "enter", gdy pole jest ostre. Przypisz obsługę klucza do pola i rozwiń rozmycie. Nie można zagnieżdżać formularzy – charlietfl

Odpowiedz

8

Można użyć jednego z dwóch poniższych sposobów, aby określić, jaka metoda javascript powinny być nazywane, gdy formularz jest składany:
* dyrektywa ngSubmit na elemencie formularza
* dyrektywa ngClick na pierwszym przycisku lub pola wprowadzania typu przesłać (wejście [Typ = przedstawić])
- 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

Dzięki, jest to ulepszenie z tego, co miałem, ale w ogóle nie reaguje na wydarzenie "enter". Po kilku manipulacjach wygląda na to, że '

' elementy i '' elementy nie są tak identyczne jak roszczenia do dokumentów. Ja [rozwidlony] (http://plnkr.co/edit/mssWTbMyZCTtKuq5tYDJ?p=preview) twój Plunker eksperymentuje z różnymi konfiguracjami 'form',' ng-form' i 'ng-submit' bez skutku. Czy masz pomysł, w jaki sposób mogę uzyskać warunkową odpowiedź na zdarzenie kluczowe "Enter", które opisałem pierwotnie? (Inny niż kluczowy przewodnik czy niestandardowa dyrektywa) –

+0

@JamieA, przepraszam, że przegapiłem część dotyczącą klawisza Enter (podniosłem twój Plunker i zmodyfikowałem go, ale testowałem tylko klikając przyciski). Myślę, że musisz utworzyć dyrektywę, aby uzyskać pożądaną funkcjonalność. –

+1

Wewnętrzne zgłoszenie nic tutaj nie robi. Działa dzięki ng-click. Angular nie wydaje się chcieć pracować z poddanymi na wewnętrznych formularzach. Prawidłowo działające zgłoszenie może skorzystać z funkcji ng-submit. Wewnętrzne zgłoszenie nie może. –

8

I'v Podobny wymóg - wieloetapowy formularz oparty na kreatorze. Kiedy użytkownik kliknie przycisk "Dalej", muszę sprawdzić aktualny formularz kroku.

Możemy wyzwolić sprawdzanie autentyczności, wyzwalając zdarzenie "$validate" na scope powiązane z formularzem.

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

Gdy kiedykolwiek Chcę sprawdzić, czy wartości formularza są poprawne, zadzwonię isFormValid z zakresem & przykład formularza.

kod robocza: Plunker link

Jest także przydatny mieć kilka dodatkowych logiki w isFormValid(zawarte w powyższej Plunker) który sprawia, że ​​forma & pól formularza $dirty jak będziemy wykazujące/ukrywanie komunikatów walidacji na podstawie na ich stanie $dirty.

+0

Na podstawie kodu plunker polecam również przełączenie stanu '$ pristine', ponieważ nie przesuwa się automatycznie po ustawieniu pola' $ dirty'. Dobra robota, dziękuję za rozwiązanie! – pulkitsinghal

+0

W czasie pisania (AngularJS <1.2), nie ma łatwego sposobu resetowania stanu '$ pritine'. Możemy zresetować stan '$ pristine' danej kontrolki lub formularza. Ale musimy również propagować tę zmianę, jeśli dowolna z pozostałych formantów w jej formie lub jej forma macierzysta są również '$ pristine'. To wymaga znacznie więcej. Od wersji 1.2 istnieje metoda: '$ setPristine (..)'. – manikanta

0

Gdy formularz jest przesyłany, można znaleźć wszystkie zagnieżdżone formy korzystania z niektórych rzeczy jak poniżej

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

Tutaj forma jest zewnętrzny kontroler formularza, który został złożony. Możesz podpiąć ten kod na ur onsubmit i znaleźć wszystkie zagnieżdżone formularze i zrobić to, co musisz.

Uwaga: To jest coffeescript

Powiązane problemy