2013-04-04 8 views
26

Mam subformat, który jest współużytkowany przez wiele widoków w mojej aplikacji. W jednym widoku ten podformularz jest wyświetlany sam z przyciskiem wstecz/kontynuacji u dołu, który prowadzi użytkownika do następnego podformularza. W innym widoku podformularz jest wyświetlany na tej samej stronie co inne podformy (w zasadzie jeden długi formularz).Jak mogę sprawdzić ważność formularza dołączonego do formularza ng z zakresu nadrzędnego?

Ponieważ html w podformularzu jest w 100% identyczny w obu widokach, podzieliłem go na częściowy i używam do renderowania ng-include. W widoku, który wyświetla tylko podformularz z przyciskami wstecz/kontynuacji, renderuję przyciski wstecz/kontynuacji w kodzie HTML rodzica.

Wizualnie wszystko działa poprawnie, a ja jestem w stanie uzyskać dostęp do wszystkich danych wprowadzonych w formularzu (user.email, user.password, user.etc...).

Problem polega na tym, że włączam/wyłączam przycisk "kontynuuj" w zależności od tego, czy użytkownik poprawnie wypełnił formularz, a to nie działa w wariancie "tylko podformularz", ponieważ zakres nadrzędny nie Zdaje się, że jest w stanie uzyskać dostęp do statusu formularza. Jeśli wciśniemy przyciski w częściowym, działa, ale nie chcę tego robić, ponieważ przyciski nie należą tam w każdym przypadku użycia częściowego.

JSFiddle Example

Wskazówki w moim przykładzie, że przycisk złożyć w czerwonej obwódce jest wyłączony aż coś jest wpisane w polu i „forma nieważne?” aktualizacje wartości, a przycisk w niebieskim obramowaniu jest zawsze włączony i "Nieprawidłowy formularz?" wartość jest pusta. W jaki sposób uzyskać dostęp do wartości myForm.$invalid z zakresu nadrzędnego?

+1

Formularze mogą zagnieżdżać się w kształcie kanciastym, a forma dziecka, która staje się nieważna, powinna unieważnić formularz nadrzędny. Ale wydaje się, że nie masz zewnętrznej formy otaczającej twój formularz ng ... – jpsimons

+0

Nie można zagnieżdżać tagów

HTML: http://stackoverflow.com/questions/4519485/can-i-nest-form-tags -in-other-form-tags. Choć technicznie działa w skrzypcach, zachowuje się nieprzewidywalnie w zależności od przeglądarki (przykład: Chrome po prostu zjada wewnętrzną formę i pozbywa się całej stylizacji). –

Odpowiedz

15

Jeśli jest to sub-formularz można po prostu przenieść formularz-tag z sub-formy i do głównego formularza: updated JSFiddle

Można też zagnieżdżać formularze za pomocą ngForm-directive:

W postaciach kątowych można zagnieżdżać. Oznacza to, że forma zewnętrzna jest ważna, gdy wszystkie formularze podrzędne są również ważne. Jednak przeglądarki nie pozwalają na zagnieżdżanie elementów, dlatego kątowy zapewnia alias ngForm, który zachowuje się identycznie, ale pozwala na zagnieżdżanie formularzy.

Rezultat jest nieco brudny. Wolę stworzyć „myForm' Dyrektywa z nowym zakresem, aby uniknąć używania $ rodzica - coś takiego:

myApp.directive('myForm',function(){ 
    return{ 
     restrict:'E', 
     scope:{model:'='}, 
     templateUrl:'/form.html', 
     replace:true 
    } 
}); 

- zobacz ten zakres JSFiddle example

+2

Pierwsza opcja nie będzie działać dla mnie, ponieważ jest to wielostronicowa forma, w której każdy "podformuł" musi być zatwierdzony niezależnie. Jednak zagnieżdżanie za pomocą dyrektywy 'ng-form' w postaci atrybutu (zamiast zagnieżdżania rzeczywistych znaczników' ') działa doskonale! Część '$ parent' była po prostu złym przykładem - mam rzeczywisty obiekt, z którym się wiąże. Oto lepszy przykład kompletnego rozwiązania, które będę używał: [JSFiddle] (http://jsfiddle.net/BLVcG/2/). Dzięki! –

+0

Aha ... ale co, jeśli twoja forma jest wewnątrz modalnego okna dialogowego i nie możesz mieć zewnętrznej formy? –

+2

Myślę, że to prawdziwa słabość w Angular. Położyli walidację na elementach formularza, a nie na modelu. Jeśli więc chcesz zdefiniować wiele formularzy dla tego samego modelu, musisz powtórzyć całą logikę walidacji. –

25

dziecka utworzony podczas korzystania NG-to jest ukrywanie funkcji formularza przed rodzicem.

Oprócz stosowania dyrektywy, można również dodać obiekt do rodziców, ale ważne jest, aby ustawić nazwę formularza do obiektu z właściwością tak:

<form name="myFormHolder.myForm"> 

oraz w regulator nadrzędny

$scope.myFormHolder = {}; 

następnie dodaje powinno działać:

$scope.myFormHolder.myForm.$pristine 

W ten sposób, gdy th e formularz jest oceniany, myForm. $ valid zostanie ustawione na rodzica. Wydaje mi się, że zadałem to samo pytanie: Why form undefined inside ng-include when checking $pristine or $setDirty()?

+1

to wydaje się bardziej jak dopuszczalna odpowiedź. bardzo pomocne dzięki! – gabereal

+0

Naprawiłam mój problem doskonale. Mam szablony html zapełnione przez dyrektywę połączoną z powtórzeniem ng, z których każdy jest zakresem głównym. To było świetne rozwiązanie, aby sprawdzić poprawność. – mortey

+0

To całkiem czysty sposób na zrobienie tego. – Skrew

Powiązane problemy