无法读取未定义的属性'$ valid'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法读取未定义的属性'$ valid'相关的知识,希望对你有一定的参考价值。
我有一个带有名称字段和两个验证的表单 - 必需和最大长度。当我输入正确的值时,控制器中的表单显示有效并返回true。但是在输入错误的数据时,$ valid不会丢错,只是简单地说 -
Cannot read property '$valid' of undefined
为什么在这种情况下表单未定义?
的jsfiddle here
提前致谢
将ng-submit
属性添加到表单:
<form name="myForm" ng-submit="SaveAndNext()" novalidate>
将控制器更改为:
function myCtrl($scope, $log){
$scope.data = {};
$scope.SaveAndNext = function(){
if($scope.myForm.$valid){
$log.info('Form is valid');
$log.info($scope.data);
} else {
$log.error('Form is not valid');
}
}
}
从提交按钮中删除ng-click
事件处理程序
更新小提琴:http://jsfiddle.net/9cgopo7d/1/
我包含了$log
服务,因为它是一个有用的默认服务,你可能不知道它。
请参阅下面的演示,通过提交点击将表单传递给控制器
ng-click="SaveAndNext(myForm)"
现在您可以轻松访问所有表单属性
function myCtrl($scope) {
$scope.SaveAndNext = function(form) {
console.log(form);
if (form.$valid) {
alert(form.$valid);
} else {
alert("!" + form.$valid)
}
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div class="registrationdetails" ng-app="" ng-controller="myCtrl">
<form name="myForm" novalidate>
<div class="list">
<div class="item list-item">
<div class="row row-center">
<div class="col-50"> <span class="form-field-name">Name</span>
</div>
<div class="col-50">
<textarea type="text" rows="5" ng-model="data.Name" name="Name" ng-maxlength=45 required></textarea> <span ng-show="myForm.Name.$dirty && myForm.Name.$invalid">
<span class="form-error" ng-show="myForm.Name.$error.required">Name is required</span>
<span class="form-error" ng-show="myForm.Name.$error.maxlength">Name should be max 45 characters</span>
</span>
</div>
</div>
</div>
<div class="item list-item">
<div class="row row-center">
<div class="col-50"> <span class="form-field-name">Type</span>
</div>
<div class="col-50">
<select ng-class="{defaultoption: !data.Type}" ng-model="data.Type" name="Type" required>
<option value="" disabled selected class="defaultoption">Type</option>
<option value="1" class="actualoption">Type 1</option>
<option value="2" class="actualoption">Type 2</option>
</select>
<span ng-show="myForm.Type.$dirty && myForm.Type.$invalid">
<span class="form-error" ng-show="myForm.Type.$error.required">Type is required</span>
</span>
</div>
</div>
</div>
<div class="item list-item">
<div class="row">
<div class="col">
<input type="submit" class="button" ng-click="SaveAndNext(myForm)" value="Next">
</div>
</div>
</div>
</div>
</form>
</div>
把$scope.data={};
放在控制器的顶部:-)
这是因为您直接提交尚未初始化数据对象的表单,因此命名data.Name无法识别。
如果你在这种情况下放置$ scope.data = {}我们已经初始化了空数据对象。所以在第二种情况下我们有至少空对象的引用,而在第一种情况下它没有任何引用。
html:
<form name="form" id='form' novalidate>
<input type="text"required name="Title" ng-model="Title">
<div ng-messages="form.Title.$error">
<div ng-message="required">Field Required</div>
</div>
</form>
JS:
$scope.save= function(){
if (!scope.createMessage.$valid) {
scope.form.$submitted = true;
return;
}
使用$ valid的格式应该是这样的。如果你没有再次访问,请访问AngularJs的官方网站。
我有类似的问题,但在我的情况下,我是一个ng - 如果创建一个没有定义形式的子范围。
刚刚更改了ng-if到ng-show,表单停止未定义。
以上是关于无法读取未定义的属性'$ valid'的主要内容,如果未能解决你的问题,请参考以下文章
TypeError.无法读取未定义的'$__'属性。无法读取未定义的'$__'属性 - Mongoose v5.^。