Мне нужно проверить, действительна ли форма в контроллере.
Посмотреть:
<form novalidate=""
name="createBusinessForm"
ng-submit="setBusinessInformation()"
class="css-form">
<!-- fields -->
</form>
В моем контроллере:
.controller(
'BusinessCtrl',
function ($scope, $http, $location, Business, BusinessService,
UserService, Photo)
{
if ($scope.createBusinessForm.$valid) {
$scope.informationStatus = true;
}
...
Я получаю такую ошибку:
TypeError: Cannot read property '$valid' of undefined
BusinessCtrl
? не могу сказать, не увидев большегоОтветы:
Попробуй это
ввиду:
<form name="formName" ng-submit="submitForm(formName)"> <!-- fields --> </form>
в контроллере:
$scope.submitForm = function(form){ if(form.$valid) { // Code here if valid } };
или
ввиду:
<form name="formName" ng-submit="submitForm(formName.$valid)"> <!-- fields --> </form>
в контроллере:
$scope.submitForm = function(formValid){ if(formValid) { // Code here if valid } };
источник
$scope.formName.$valid
результаты undefined?formName.$valid
доступ к нему можно получить только в шаблоне, если вы хотите получить доступ в контроллере, вам нужно создать объект для этого, как$scope.forms.formName
и в шаблоне:<form name="forms.formName">
проверьте этот комментарийЯ обновил контроллер, чтобы:
.controller('BusinessCtrl', function ($scope, $http, $location, Business, BusinessService, UserService, Photo) { $scope.$watch('createBusinessForm.$valid', function(newVal) { //$scope.valid = newVal; $scope.informationStatus = true; }); ...
источник
vm
подход. Можете ли вы создать плункер для того же ответа, используя подход «контроллер как синтаксис». Я не могу этого сделать. Это будет полезно и для тех, кто ищет ответ в сегодняшнем контексте. СпасибоВот еще одно решение
Установите скрытую переменную области в вашем html, затем вы можете использовать ее со своего контроллера:
<span style="display:none" >{{ formValid = myForm.$valid}}</span>
Вот полный рабочий пример:
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>
источник
BusinessCtrl
Инициализируется передcreateBusinessForm
«сFormController
. Даже если у вас естьngController
форма, она не будет работать так, как вы хотели. Вы ничего не можете с этим поделать (вы можете создать свойngControllerDirective
и попытаться обмануть приоритет). Вот как работает angularjs.См. Этот plnkr, например: http://plnkr.co/edit/WYyu3raWQHkJ7XQzpDtY?p=preview
источник