Muszę sprawdzić, czy formularz jest ważny w kontrolerze.
Widok:
<form novalidate=""
name="createBusinessForm"
ng-submit="setBusinessInformation()"
class="css-form">
<!-- fields -->
</form>
W moim kontrolerze:
.controller(
'BusinessCtrl',
function ($scope, $http, $location, Business, BusinessService,
UserService, Photo)
{
if ($scope.createBusinessForm.$valid) {
$scope.informationStatus = true;
}
...
Otrzymuję ten błąd:
TypeError: Cannot read property '$valid' of undefined
BusinessCtrl
? nie mogę powiedzieć, nie widząc więcejOdpowiedzi:
Spróbuj tego
z uwagi:
<form name="formName" ng-submit="submitForm(formName)"> <!-- fields --> </form>
w kontrolerze:
$scope.submitForm = function(form){ if(form.$valid) { // Code here if valid } };
lub
z uwagi:
<form name="formName" ng-submit="submitForm(formName.$valid)"> <!-- fields --> </form>
w kontrolerze:
$scope.submitForm = function(formValid){ if(formValid) { // Code here if valid } };
źródło
$scope.formName.$valid
skutkuje undefined?formName.$valid
można uzyskać dostęp tylko w szablonie, jeśli chcesz uzyskać dostęp w kontrolerze, musisz utworzyć obiekt do tego podobnego$scope.forms.formName
i w szablonie:<form name="forms.formName">
sprawdź ten komentarzZaktualizowałem kontroler do:
.controller('BusinessCtrl', function ($scope, $http, $location, Business, BusinessService, UserService, Photo) { $scope.$watch('createBusinessForm.$valid', function(newVal) { //$scope.valid = newVal; $scope.informationStatus = true; }); ...
źródło
vm
podejścia. czy możesz utworzyć plunker dla tej samej odpowiedzi, używając kontrolera jako podejścia składniowego. Nie jestem w stanie tego zrobić. Będzie pomocny także dla innych, którzy szukają odpowiedzi w dzisiejszym kontekście. DziękiOto inne rozwiązanie
Ustaw ukrytą zmienną zakresu w swoim html, a następnie możesz jej użyć ze swojego kontrolera:
<span style="display:none" >{{ formValid = myForm.$valid}}</span>
Oto pełny przykład działania:
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>
źródło
BusinessCtrl
Zostaje zainicjowany przedcreateBusinessForm
„sFormController
. Nawet jeśli maszngController
na formularzu, nie będzie działać tak, jak chciałeś. Nic na to niengControllerDirective
poradzisz (możesz stworzyć swój i spróbować oszukać priorytet). Tak działa angularjs.Zobacz na przykład ten plik plnkr: http://plnkr.co/edit/WYyu3raWQHkJ7XQzpDtY?p=preview
źródło