无法从AngularJS中的控制器访问表单

无法从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

我正在尝试在我的视图中检查表单的$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.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()
    -在摘要周期的每一轮调用。提供了检测更改并对其采取行动的机会。您希望对检测到的更改做出响应的任何操作都必须从此钩子中调用;实现这一点对调用
    $onChanges
    没有影响。例如,如果您希望执行深度相等性检查,或者检查日期对象,AngularJS的更改检测器不会检测到该对象的更改,因此不会触发
    $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); 
});