我可以访问控制器中的表单吗?
我目前正在使用以下内容。
$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-if
, ng-repeat
或ng-include
)将创build一个独立的子范围。 所以将定义的scope: {}
属性的任何自定义指令。 也许,你的基础组件也是你的方式。
当在<form>
标签中引入一个简单的ng-if
时,我遇到了同样的问题。
请参阅这些了解更多信息:
-
AngularJS – 使用ng-include时会丢失范围
注意:我build议你重新写你的问题。 你的问题的答案是肯定的,但你的问题稍有不同:
我可以从控制器访问子范围的表单吗?
答案只是: 不 。
是的,您可以通过使用this.formname访问控制器。
当然,你不能在范围访问表单。 它不是创build的。 来自html模板的DOM像控制器构造函数一样缓慢加载。 解决scheme是观看,直到DOM加载和所有的范围定义!
在控制器中:
$timeout(function(){ console.log('customerForm:', $scope.customerForm); // everything else what you need });