childScope表单上的AngularJS $ setValidity

时间:2013-08-22 13:32:36

标签: angularjs

我有一个窗格系统,在我的控制器中包含三种不同的窗体。 现在,据我所知,ng-include创建了一个让父范围无法使用的childscope。

为了解决表单数据,我在ng-submit中运行的函数中传递了ng-model,但这只是单向的。

在正常情况下,我可以这样做:

HTML Form tag example
<form novalidate name="myForm" ng-submit="someFunction(form)">

HTML Form Field example
<input ng-model="form.first_name" name="first_name" type="text" pwtest required/>

Controller
$scope.myForm.first_name.$setValidity('required', false);

这很好用,我的表单数据会返回,我可以在去往我的API的途中发送它,我的字段状态也正确设置。

现在问题..

HTML Form tag example
<form novalidate name="myForm" ng-submit="someFunction(form)">

HTML Form Field example
<input ng-model="form.first_name" name="first_name" type="text" pwtest required/>

Controller
$scope.myForm.first_name.$setValidity('required', false); <-- fails since myForm doesnt exist

这个规范有效但现在我的表格存在于一个儿童范围内,因此 myForm 在我的控制器中变得不确定,因为它当然应该是因为它不存在于范围内。

问题是,如何从父控制器控制子视图中的表单字段状态?

1 个答案:

答案 0 :(得分:4)

根据上面的评论,这是使用子控制器解决问题的一种方法:

<script type="text/ng-template" id="/form.html">
    <form novalidate name="myForm" ng-submit="someFn()" ng-controller="ChildFormCtrl">
       <input ng-model="form.first_name" name="first_name" type="text" required> 
       <br>{{myForm.first_name.$valid}}
    </form>
</script>

<div ng-controller="MyCtrl">
    <div ng-include="'/form.html'"></div>
</div>

function ChildFormCtrl($scope) {
    $scope.someFn = function () {
        console.log('child', $scope.form);
        $scope.myForm.first_name.$setValidity('required', false);
        $scope.parentFunction($scope.form);
    }
}
function MyCtrl($scope) {
    $scope.parentFunction = function (form) {
        console.log('parent', form);
    }
}

fiddle