如何在控制器中将表单初始化为范围变量

How to initialize form as scope variable in controller

我有一个简单的 angular 表格

<form name="myForm" ng-controller="myFormController"></form>

需要在myFormController中调用$setPristine()myForm。将此表单初始化为 $scope 变量的最佳方法是什么?

我试过 $scope.myForm.$setPristine(); 但它给了我:

Cannot read property '$setPristine' of undefined

提前致谢。


编辑 来自 docs:

name (optional) Name of the form. If specified, the form controller will be published into related scope, under this name.

这意味着您可以在控制器中访问它,但是如何访问它?

在你的控制器中试试这个。

$timeout(function () {
   // here you should be able to access $scope.myForm
})

form 指令确实将表单名称发布到作用域。但是,如果表单嵌套在 ng-controller 元素内,则当控制器函数运行时,表单的作用域变量不可用。

举例说明:

<div ng-controller="OuterCtrl">
  <form name="form1">
    <div ng-controller="InnerCtrl"></div>
  </form>
</div>

会发生以下情况:

.controller("OuterCtrl", function($scope){
   // $scope.form1.$setPristine(); // this will fail
})
.controller("InnerCtrl", function($scope){
   $scope.form1.$setPristine(); // this will succeed
});

控制器功能运行时很少需要访问表单。通常,它是为了响应某些操作而完成的,例如提交操作。发生这种情况时,"OuterCtrl" 将具有 $scope.form1:

.controller("OuterCtrl", function($scope){
   $scope.submitForm = function(){
      //... do something with form data
      $scope.form1.$setPristine();
   }
});

在这方面,$timeout 实际上可以工作并且不会导致竞争条件。但是你应该重新检查一下为什么你需要控制器函数第一次运行时的形式。

我只是浪费了一些时间来处理这个问题。在我的例子中,稍后我使用 ng-if 显示了表格。将表单条件更改为 ng-show 解决了 $scope.myform.

的未初始化问题