无法从AngularJS中的控制器访问表单
我正在尝试在我的视图中检查表单的$valid属性:无法从AngularJS中的控制器访问表单,angularjs,Angularjs,我正在尝试在我的视图中检查表单的$valid属性: <!DOCTYPE html> <html ng-app="app"> <head> <meta charset="utf-8" /> <title>Form</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min
<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="utf-8" />
<title>Form</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<script src="app.js"></script>
<script src="controller.js"></script>
</head>
<body ng-controller="FormController as $ctrl">
<form name="$ctrl.myForm">
<div>
<input type="text" name="myName" ng-model="$ctrl.name">
</div>
</form>
</body>
</html>
我的应用程序:
(function(){
var app = angular.module('app',[]);
})();
不确定问题出在哪里,但我不断发现以下错误:
我刚刚试着将“vm”打印到控制台上,得到了如下结果:
如何从“vm”访问“myForm”属性?
如何在控制器中检查表单是否有效?我尝试了使用vm.myForm.$valid
,但出现错误,提示“无法读取未定义的”
的属性“$valid”
需要一个摘要周期来处理name=$ctrl.myForm
属性
使用$doCheck
等待:
从文档中:
生命周期挂钩
指令控制器可以提供AngularJS在指令生命周期中调用的以下方法:
-在摘要周期的每一轮调用。提供了检测更改并对其采取行动的机会。您希望对检测到的更改做出响应的任何操作都必须从此钩子中调用;实现这一点对调用$doCheck()
没有影响。例如,如果您希望执行深度相等性检查,或者检查日期对象,AngularJS的更改检测器不会检测到该对象的更改,因此不会触发$onChanges
,则此钩子可能很有用。调用此钩子时不带任何参数;如果检测到更改,则必须存储以前的值,以便与当前值进行比较$onChanges
我使用了
$timeout
而不是$doCheck
函数,它也起了作用:
$timeout(function(){
console.log(vm.myForm.$error);
});
使用$timeout
是一个更大问题的症状
通常,控制器应等待用户提交表单。或者控制器应使用指令对用户输入作出反应。在这两种情况下,在框架调用任何一个函数之前,都将验证输入。只有在用户输入后才能检查有效性 我现在无法验证,但我相信您不需要在html中的表单名称之前使用
$ctrl.
。它应该是
,然后您就可以按您尝试的方式访问它。在这种情况下工作正常。@georgeawg如何检查表单在控制器中是否有效?我尝试使用“vm.myForm.$valid”,但出现了一个错误,错误是“无法读取未定义的属性”$valid“。谢谢,georgeawg!现在我明白了,我们需要等待摘要循环处理,然后才能检查表单。我使用了$timeout而不是$doCheck函数,它也起作用:$timeout(function(){console.log(vm.myForm.$error);});
function formController($timeout){
var vm = this;
var oldMyForm = false;
this.$doCheck = function() {
if (!oldMyForm && vm.myForm) {
console.log("$valid="+vm.myForm.$valid);
}
oldMyForm = vm.myForm;
};
}
$timeout(function(){
console.log(vm.myForm.$error);
});