AngularJS, formun denetleyicide geçerli olup olmadığını kontrol eder


87

Bir kontrolörde bir formun geçerli olup olmadığını kontrol etmem gerekiyor.

Görünüm:

<form novalidate=""
      name="createBusinessForm"
      ng-submit="setBusinessInformation()"
      class="css-form">
 <!-- fields -->
</form>

Denetleyicimde:

.controller(
    'BusinessCtrl',
    function ($scope, $http, $location, Business, BusinessService, 
              UserService, Photo)
    {

        if ($scope.createBusinessForm.$valid) {
            $scope.informationStatus = true;
        }

        ...

Bu hatayı alıyorum:

TypeError: Cannot read property '$valid' of undefined

Denetleyicideki setBusinessInformation işlevinin etrafına sardınız mı?
matsko

3
neyin yanlış olabileceğini analiz etmek için fazla parçalanmış kod ... jsfiddle.net veya plunker'da sorunu kopyalayan basit bir demo oluşturun. Form kapsam dahilinde BusinessCtrlmi? daha fazlasını görmeden söyleyemem
charlietfl

@matsko: Hayır. Bu kodu denetleyici başlatılırken çalıştırmam gerekiyor.
Rober

@charlietfl: Daha fazlası yok. Örneği basitleştirmek için bazı kodları kaldırıyorum. Evet, form BusinessCtrl kapsamında olmalıdır (denetleyici app.js'deki rotalarda ayarlanmıştır. Çözümümü aşağıdaki cevaba ekliyorum. Ancak neden bu şekilde çalışmadığını bilmiyorum.
Rober

Yanıtlar:


109

Bunu dene

görünümünde:

<form name="formName" ng-submit="submitForm(formName)">
 <!-- fields -->
</form>

denetleyicide:

$scope.submitForm = function(form){
  if(form.$valid) {
   // Code here if valid
  }
};

veya

görünümünde:

<form name="formName" ng-submit="submitForm(formName.$valid)">
  <!-- fields -->
</form>

denetleyicide:

$scope.submitForm = function(formValid){
  if(formValid) {
    // Code here if valid
  }
};

Bir formdaki birden çok düğmeyi doğrulamak istersem ne olur?
Fahad Mullaji

bu benim için çalıştı, ancak neden $scope.formName.$validtanımsız ile sonuçlanıyor?
ps0604

Eğer ng-if kullanırsanız $ kapsam.formName. $ Valid çalışmaz ve ng-show kullanırsanız $ kapsam.formName. $ Valid çalışacaktır.
Vaibhav Shaha

2
Bu en iyi cevap olmalı, basit. Ama formu geçersiz halledebilir misin? Hangi girişlerin geçersiz olduğunu kullanıcıya nasıl gösterebilirsiniz?
Nicolas Leucci

1
@ ps0604'e formName.$validyalnızca şablondan erişilebilir, denetleyiciye erişmek istiyorsanız, bunun gibi $scope.forms.formNameve şablonda bir nesne oluşturmanız gerekir : <form name="forms.formName"> bu yorumu kontrol edin
Damsorian

29

Denetleyiciyi şu şekilde güncelledim:

.controller('BusinessCtrl',
    function ($scope, $http, $location, Business, BusinessService, UserService, Photo) {
        $scope.$watch('createBusinessForm.$valid', function(newVal) {
            //$scope.valid = newVal;
            $scope.informationStatus = true;
        });
        ...

Ayrıca şunu da unutmayın - Form bir Modal ise, form adını nokta notasyonu olarak bildirmeyi unutmayın, örneğin: "data.theform" ve denetleyicinizde $ kapsam.data.theform olarak erişin
Jasper

2
Bu benim için çalışmıyor. Lütfen denetleyicinin $ kapsamına 'createBusinessForm'u nasıl aldığınızı gösterin.
cyrf

$ kapsam şeyler gitti, şimdi vmyaklaşımı kullandığımız günler . sözdizimi yaklaşımı olarak denetleyiciyi kullanarak aynı yanıt için bir plunker oluşturabilirsiniz. Ben yapamıyorum Bugünün bağlamı ile cevap arayan başkaları için de faydalı olacaktır. Teşekkürler
ankitd

14

İşte başka bir çözüm

Html'nizde gizli bir kapsam değişkeni ayarlayın, ardından bunu denetleyicinizden kullanabilirsiniz:

<span style="display:none" >{{ formValid = myForm.$valid}}</span>

İşte tam çalışma örneği:

angular.module('App', [])
.controller('myController', function($scope) {
  $scope.userType = 'guest';
  $scope.formValid = false;
  console.info('Ctrl init, no form.');
  
  $scope.$watch('myForm', function() {
    console.info('myForm watch');
    console.log($scope.formValid);
  });
  
  $scope.isFormValid = function() {
    //test the new scope variable
    console.log('form valid?: ', $scope.formValid);
  };
});
<!doctype html>
<html ng-app="App">
<head>
 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.1/angular.min.js"></script>
</head>
<body>

<form name="myForm" ng-controller="myController">
  userType: <input name="input" ng-model="userType" required>
  <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
  <tt>userType = {{userType}}</tt><br>
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
  <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
  
  
  /*-- Hidden Variable formValid to use in your controller --*/
  <span style="display:none" >{{ formValid = myForm.$valid}}</span>
  
  
  <br/>
  <button ng-click="isFormValid()">Check Valid</button>
 </form>
</body>
</html>


4

BusinessCtrlÖnce bir sıfırlanır createBusinessForm's FormController. ngControllerFormda sizde olsa bile istediğiniz şekilde çalışmayacaktır. Buna yardımcı olamazsınız (kendinizinkini oluşturabilir ngControllerDirectiveve önceliği kandırabilirsiniz.) Angularjs bu şekilde çalışır.

Örneğin bu plnkr'a bakın: http://plnkr.co/edit/WYyu3raWQHkJ7XQzpDtY?p=preview

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.