Preciso verificar se um formulário é válido em um controlador.
Visão:
<form novalidate=""
name="createBusinessForm"
ng-submit="setBusinessInformation()"
class="css-form">
<!-- fields -->
</form>
No meu controlador:
.controller(
'BusinessCtrl',
function ($scope, $http, $location, Business, BusinessService,
UserService, Photo)
{
if ($scope.createBusinessForm.$valid) {
$scope.informationStatus = true;
}
...
Estou recebendo este erro:
TypeError: Cannot read property '$valid' of undefined
BusinessCtrl
? não posso dizer sem ver maisRespostas:
Tente isto
em vista:
<form name="formName" ng-submit="submitForm(formName)"> <!-- fields --> </form>
no controlador:
$scope.submitForm = function(form){ if(form.$valid) { // Code here if valid } };
ou
em vista:
<form name="formName" ng-submit="submitForm(formName.$valid)"> <!-- fields --> </form>
no controlador:
$scope.submitForm = function(formValid){ if(formValid) { // Code here if valid } };
fonte
$scope.formName.$valid
resulta em indefinido?formName.$valid
pode ser acessado apenas no template, se você deseja acessar no controlador você precisa criar um objeto para esse gosto$scope.forms.formName
e no template:<form name="forms.formName">
verifique este comentárioEu atualizei o controlador para:
.controller('BusinessCtrl', function ($scope, $http, $location, Business, BusinessService, UserService, Photo) { $scope.$watch('createBusinessForm.$valid', function(newVal) { //$scope.valid = newVal; $scope.informationStatus = true; }); ...
fonte
vm
abordagem. você pode criar um plunker para a mesma resposta usando o controlador como abordagem de sintaxe. Eu não sou capaz de fazer isso. Será útil também para outros que estão procurando uma resposta no contexto de hoje. ObrigadoAqui está outra solução
Defina uma variável de escopo oculta em seu html, então você pode usá-la em seu controlador:
<span style="display:none" >{{ formValid = myForm.$valid}}</span>
Aqui está o exemplo de trabalho 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>
fonte
O
BusinessCtrl
é inicializado antes docreateBusinessForm
'sFormController
. Mesmo se você tiver ongController
no formulário, não funcionará da maneira que você queria. Você não pode evitar isso (você pode criar o seungControllerDirective
e tentar enganar a prioridade). É assim que o angularjs funciona.Consulte este plnkr por exemplo: http://plnkr.co/edit/WYyu3raWQHkJ7XQzpDtY?p=preview
fonte