2015-06-03 16 views
29

HTML:Programowo ustawić wszystkie pola formularza do NG-poruszył składania formularza

<div class="form-group" 
    ng-class="{ 'has-error' : form.firstName.$invalid && form.firstName.$touched }"> 
    <label for="firstName" 
     class="control-label"> 
     First Name 
    </label> 
    <input type="text" 
     name="firstName" 
     id="firstName" 
     ng-model="editableUser.firstName" 
     class="form-control" 
     required> 
    <span class="help-block" 
     ng-show="form.firstName.$error.required && form.firstName.$touched"> 
     First Name is required 
    </span> 
</div> 

<input type="submit" 
     ng-click="submit()" 
     value="Submit" 
     class="btn btn-default"> 

próbuję dostać moją klasę „ma błędów” kopać w poszukiwaniu błędnych pól, gdy użytkownik kliknie złożyć.

byłoby Myślę, że można zrobić coś takiego:

$scope.submit = function() { 
    if ($scope.form.$invalid) { 
    angular.forEach($scope.form.$invalid, function(field) { 
     field.$setTouched(); 
    }); 
    alert("Form is invalid."); 
    } 
}; 

Ale nie ma $setTouched metoda https://docs.angularjs.org/api/ng/type/form.FormController

EDIT: Zrealizować $setTouched istnieje, to w https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

+0

Co ma jedno z pól formularza wyglądać? Czy mógłbyś edytować swoje pytanie, dodając przykład? Interesuje mnie, dlaczego sprawdzasz również, czy $ jest dotknięte? –

+0

co, jeśli zamiast tego używasz setDirty? –

+0

@BenHeymink Dodany kod do wyjaśnienia. – Derek

Odpowiedz

46
if ($scope.form.$invalid) { 
    angular.forEach($scope.form.$error, function (field) { 
     angular.forEach(field, function(errorField){ 
      errorField.$setTouched(); 
     }) 
    }); 
    alert("Form is invalid."); 
} 

plunker: http://plnkr.co/edit/XmvoTkIQ0yvFukrVSz11

-4

Nie jestem pewien, dlaczego uważasz, że musisz "dotknąć" pól, wystarczy użyć regularnego sprawdzania poprawności formularza; wystarczy zawinąć pola w rzeczywisty element formularza, a następnie pozwolić kanciarzowi zająć się sprawdzaniem poprawności. Here is a working example..

Naprawdę nie musisz sprawdzać, czy $ dotknął, a nawet ustawił (chyba że istnieje konkretny powód, dla którego musisz to zrobić?) - po prostu użyj wymaganego atrybutu na polach wejściowych, jeśli są wymagane pola :

<input name="namefield" "text" ng-model="user.firstName" required/> 
+0

Ponieważ czasami wymagane są tylko style błędów i komunikaty pojawiają się po próbie przesłania formularza przez użytkownika po raz pierwszy. Myślę, że do tego przywykła większość ludzi. jQuery Validate zachowuje się podobnie. Nie głosowałem z tobą przy okazji. – mono68

+0

Wystarczająco fair. Wygląda na to, że użytkownik może wykonać akcję, o której wiesz, że się nie powiedzie (pozwalając, aby trafił, gdy masz sprawdzanie poprawności po stronie klienta), ale każdy na własną rękę :) –

+2

Na przykład formularz z typem wejściowym e-maile rozpraszałyby Cię wiadomościami o błędach, dopóki wprowadzony adres nie będzie dobrze sformułowany. Użytkownik powinien mieć możliwość wypełnienia formularza bez błędu, jeśli jego dane wejściowe są ważne na końcu. – mono68

5

Rozszerzenie na odpowiedź Aleksieja, można dodać nową metodę FormController że zrobi to samo, więc nie ma potrzeby, aby skopiować kod z przedłożyć funkcję do drugiego:

// config.js 
export default function config($provide) { 
    $provide.decorator('formDirective', $delegate => { 
     const fn = $delegate[0].controller.prototype 
     if (!('$setTouched' in fn)) fn.$setTouched = function() { 
      if (this.$invalid) { 
       Object.values(this.$error).forEach(controls => { 
        controls.forEach(control => control.$setTouched()) 
       }) 
      } 
     } 
     return $delegate 
    }) 
} 
// controller.js 
$scope.submit = function() { 
    if ($scope.form.$invalid) { 
     $scope.form.$setTouched(); 
     alert("Form is invalid."); 
    } 
}; 

Na wypadek, gdyby ktoś zastanawiał się, dlaczego ktoś chciałby dokonać takiego sprawdzenia poprawności: brak jest sprawdzania poprawności ograniczenia iOS, więc ng-submit zostaje wywołane nawet w przypadku nieprawidłowych formularzy.

16

Spróbuj ostatnio dodane $ składać

<input type="text" 
    name="firstName" 
    id="firstName" 
    ng-model="editableUser.firstName" 
    class="form-control" 
    required> 
    <span class="help-block" 
    ng-show="form.firstName.$error.required && (form.firstName.$touched || form.$submitted"> 
    First Name is required 

+5

Dodatkowo - jeśli twoja funkcja jest wyzwalana przez element zakotwiczający, a nie jako wejście typu submit - możesz dodać '$ scope.myForm. $ SetSubmitted();' do swojej funkcji. – mono68

+0

Najbardziej lubię to rozwiązanie - nie ma potrzeby stosowania dodatkowej logiki sterownika, jeśli zamiast tego możesz użyć wbudowanej logiki! – fiznool

+0

Dzięki za świetną wskazówkę na temat przesłanych $ nieruchomości! W moim przypadku działa dobrze następujące: "fullname.invalid && (fullname.touched || form.submitted)" – simonbor

0

Jeśli masz ochotę uisng ES6 + lodash fp

import forEach from 'lodash/fp/forEach' 

    validate() 
    { 
     forEach(forEach(field => field.$setTouched()))(this.form.$error) 
    } 

<form name="$ctrl.form">...</form> 
Powiązane problemy