我有一个简单的角形
<form name="myForm" ng-controller="myFormController"></form>
需要在$setPristine()
中致电myForm
至myFormController
。将此表单初始化为$scope
变量的最佳方法是什么?
我试过$scope.myForm.$setPristine();
,但它给了我:
无法阅读属性&#39; $ setPristine&#39;未定义的
提前致谢。
编辑来自docs:
名称(可选) 表格的名称。如果指定,表单控制器将以此名称发布到相关范围。
这意味着您可以在控制器中访问它,但是如何?
答案 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
的未初始化。