Je dois vérifier si un formulaire est valide dans un contrôleur.
Vue:
<form novalidate=""
name="createBusinessForm"
ng-submit="setBusinessInformation()"
class="css-form">
<!-- fields -->
</form>
Dans mon contrôleur:
.controller(
'BusinessCtrl',
function ($scope, $http, $location, Business, BusinessService,
UserService, Photo)
{
if ($scope.createBusinessForm.$valid) {
$scope.informationStatus = true;
}
...
J'obtiens cette erreur:
TypeError: Cannot read property '$valid' of undefined
BusinessCtrl
? ne peut pas dire sans en voir plusRéponses:
Essaye ça
en vue:
<form name="formName" ng-submit="submitForm(formName)"> <!-- fields --> </form>
dans le contrôleur:
$scope.submitForm = function(form){ if(form.$valid) { // Code here if valid } };
ou
en vue:
<form name="formName" ng-submit="submitForm(formName.$valid)"> <!-- fields --> </form>
dans le contrôleur:
$scope.submitForm = function(formValid){ if(formValid) { // Code here if valid } };
la source
$scope.formName.$valid
résultats sont indéfinis?formName.$valid
ne peut être consulté que dans le modèle, si vous voulez accéder au contrôleur, vous devez créer un objet pour cela comme$scope.forms.formName
et dans le modèle:<form name="forms.formName">
vérifiez ce commentaireJ'ai mis à jour le contrôleur pour:
.controller('BusinessCtrl', function ($scope, $http, $location, Business, BusinessService, UserService, Photo) { $scope.$watch('createBusinessForm.$valid', function(newVal) { //$scope.valid = newVal; $scope.informationStatus = true; }); ...
la source
vm
approche. pouvez-vous créer un plunker pour la même réponse en utilisant le contrôleur comme approche syntaxique. Je ne peux pas le faire. Cela sera également utile pour d'autres qui recherchent une réponse dans le contexte actuel. MerciVoici une autre solution
Définissez une variable de portée cachée dans votre html, puis vous pouvez l'utiliser à partir de votre contrôleur:
<span style="display:none" >{{ formValid = myForm.$valid}}</span>
Voici l'exemple de travail complet:
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>
la source
Le
BusinessCtrl
est initialisé avant lecreateBusinessForm
'sFormController
. Même si vous avez lengController
sur le formulaire ne fonctionnera pas comme vous le souhaitez. Vous ne pouvez pas vous en empêcher (vous pouvez créer votrengControllerDirective
, et essayer de tromper la priorité.) C'est ainsi que fonctionne angularjs.Voir ce plnkr par exemple: http://plnkr.co/edit/WYyu3raWQHkJ7XQzpDtY?p=preview
la source