我可以访问控制器中的表单吗?

我目前正在使用以下内容。

$scope.$$childHead.customerForm[firstName] ,这样:

 <form name="customerForm"> <input type="text" name="firstName" ng-model="data.customer.firstName" tabindex="1" ng-disabled="!data.editable" validationcustomer /> </form> 

但是这只适用于Chrome。 现在我尝试了以下内容:

$scope.editCustomerForm[firstName] ,这样:

 <form name="customerForm" ng-model="editCustomerForm"> <input type="text" name="firstName" ng-model="data.customer.firstName" tabindex="1" ng-disabled="!data.editable" validationcustomer /> </form> 

哪个不行 注意我的表单在基础选项卡内。 我怎样才能访问firstName

编辑 :它看起来像form没有被添加到scope当它在一个基础标签。

任何人都有这个解决scheme?

虽然在其他评论中暗指我想我会为那些使用“Controller As”语法的人说明一下:

 <div ng-controller="MyController as ctrl"> <form name="ctrl.myForm"> ...inputs Dirty? {{ctrl.myForm.$dirty}} <button ng-click="ctrl.saveChanges()">Save</button> </form> </div> 

然后你可以访问你的代码中的FormController:

 function MyController () { var vm = this; vm.saveChanges = saveChanges; function saveChanges() { if(vm.myForm.$valid) { // Save to db or whatever. vm.myForm.$setPristine(); } } 

您可以将表单附加到在父控制器中定义的某个对象。 然后你甚至可以从一个孩子的范围到达你的表格。

家长控制器

 $scope.forms = {}; 

子范围中的一些模板

 <form name="forms.form1"> </form> 

问题在于,在执行控制器中的代码的时候,不必定义表单。 所以你必须这样做

 $scope.$watch('forms.form1', function(form) { if(form) { // your code... } }); 

如果您想将表单传递给控制器​​以进行validation,则可以将其作为parameter passing给处理提交的方法。 使用表单名称,所​​以对于原来的问题,它会是这样的:

 <button ng-click="submit(customerForm)">Save</button> 

有点迟到的答案,但带有以下选项。 它正在为我工​​作,但不知道这是否是正确的方式。

在我看来,我正在这样做:

 <form name="formName"> <div ng-init="setForm(formName);"></div> </form> 

而在控制器中:

 $scope.setForm = function (form) { $scope.myForm = form; } 

现在做完这个后,我的控制器variables是$scope.myForm

为了能够访问您的控制器中的表单,您必须将其添加到一个虚拟的范围对象。

$scope.dummy = {}

对于你的情况,这意味着像这样:

 <form name="dummy.customerForm"> 

在您的控制器中,您将能够通过以下方式访问表单:

 $scope.dummy.customerForm 

你将可以做类似的东西

 $scope.dummy.customerForm.$setPristine() 

WIKI LINK

有一个 '。' 在你的模型中将确保原型inheritance的发挥。 所以,使用<input type="text" ng-model="someObj.prop1">而不是<input type="text" ng-model="prop1">

如果你真的想/需要使用一个原语,有两个解决方法:

1.在子作用域中使用$ parent.parentScopeProperty。 这将阻止子范围创build自己的财产。 2.在父范围上定义一个函数,并从子项调用它,将原始值传递给父项(不总是可能的)

这个答案有点迟,但是我偶然发现了一个让所有事情都变得更容易的解决scheme。

如果您使用的是controllerAs语法,则可以直接将表单名称指定给您的控制器,然后从“this”variables中引用它。 以下是我在代码中完成的操作:

我通过ui-routerconfiguration了控制器(但是你可以做到这一点,即使在HTML中直接使用类似于<div ng-controller="someController as myCtrl"> )这就是ui-路由器configuration:

 views: { "": { templateUrl: "someTemplate.html", controller: "someController", controllerAs: "myCtrl" } } 

然后在HTML中,您只需将表单名称设置为“controllerAs”。“name”就像这样:

 <ng-form name="myCtrl.someForm"> <!-- example form code here --> <input name="firstName" ng-model="myCtrl.user.firstName" required> </ng-form> 

现在在你的控制器里,你可以很简单的做到这一点

 angular .module("something") .controller("someController", [ "$scope", function ($scope) { var vm = this; if(vm.someForm.$valid){ // do something } }]); 

是的,您可以访问控制器中的表单(如文档中所述)。

除非您的表单没有在控制器范围中定义,而是在子范围中定义。

基本上,一些angular度指令(如ng-ifng-repeatng-include )将创build一个独立的子范围。 所以将定义的scope: {}属性的任何自定义指令。 也许,你的基础组件也是你的方式。

当在<form>标签中引入一个简单的ng-if时,我遇到了同样的问题。

请参阅这些了解更多信息:

注意:我build议你重新写你的问题。 你的问题的答案是肯定的,但你的问题稍有不同:

我可以从控制器访问子范围的表单吗?

答案只是:

是的,您可以通过使用this.formname访问控制器。

当然,你不能在范围访问表单。 它不是创build的。 来自html模板的DOM像控制器构造函数一样缓慢加载。 解决scheme是观看,直到DOM加载和所有的范围定义!

在控制器中:

 $timeout(function(){ console.log('customerForm:', $scope.customerForm); // everything else what you need });