Necesito verificar si un formulario es válido en un controlador.
Ver:
<form novalidate=""
name="createBusinessForm"
ng-submit="setBusinessInformation()"
class="css-form">
<!-- fields -->
</form>
En mi controlador:
.controller(
'BusinessCtrl',
function ($scope, $http, $location, Business, BusinessService,
UserService, Photo)
{
if ($scope.createBusinessForm.$valid) {
$scope.informationStatus = true;
}
...
Recibo este error:
TypeError: Cannot read property '$valid' of undefined
BusinessCtrl
? no puedo decir sin ver másRespuestas:
Prueba esto
en vista:
<form name="formName" ng-submit="submitForm(formName)"> <!-- fields --> </form>
en controlador:
$scope.submitForm = function(form){ if(form.$valid) { // Code here if valid } };
o
en vista:
<form name="formName" ng-submit="submitForm(formName.$valid)"> <!-- fields --> </form>
en controlador:
$scope.submitForm = function(formValid){ if(formValid) { // Code here if valid } };
fuente
$scope.formName.$valid
resulta indefinido?formName.$valid
se puede acceder solo en la plantilla, si desea acceder en el controlador, debe crear un objeto para ese me gusta$scope.forms.formName
y en la plantilla:<form name="forms.formName">
verifique este comentarioHe actualizado el controlador a:
.controller('BusinessCtrl', function ($scope, $http, $location, Business, BusinessService, UserService, Photo) { $scope.$watch('createBusinessForm.$valid', function(newVal) { //$scope.valid = newVal; $scope.informationStatus = true; }); ...
fuente
vm
enfoque. ¿Puede crear un plunker para la misma respuesta utilizando el controlador como enfoque de sintaxis? No puedo hacerlo. También será útil para otros que estén buscando una respuesta con el contexto actual. GraciasAquí hay otra solución
Establezca una variable de alcance oculta en su html y luego podrá usarla desde su controlador:
<span style="display:none" >{{ formValid = myForm.$valid}}</span>
Aquí está el ejemplo de trabajo completo:
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>
fuente
El
BusinessCtrl
es inicializado antes de que loscreateBusinessForm
'sFormController
. Incluso si tiene elngController
formulario en el formulario, no funcionará como deseaba. No puedes evitar esto (puedes crear el tuyongControllerDirective
e intentar engañar a la prioridad). Así es como funciona angularjs.Vea este plnkr por ejemplo: http://plnkr.co/edit/WYyu3raWQHkJ7XQzpDtY?p=preview
fuente