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

时间:2015-02-27 13:36:33

标签: angularjs angularjs-scope angularjs-controller

我有一个简单的角形

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

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

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

  

无法阅读属性&#39; $ setPristine&#39;未定义的

提前致谢。


编辑来自docs

  

名称(可选)   表格的名称。如果指定,表单控制器将以此名称发布到相关范围。

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

3 个答案:

答案 0 :(得分:2)

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实际上会起作用,不会引起竞争条件。但是,当控制器函数首次运行时,你应该重新检查为什么你需要它。

答案 1 :(得分:1)

在您的控制器中尝试此操作。

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

答案 2 :(得分:0)

我只是浪费了一些时间来处理这个问题。就我而言,我稍后使用ng-if显示了该表格。将表单条件更改为ng-show可解决$scope.myform的未初始化。