编辑2:我会留下我的答案,因为可能出于其他原因可能会有所帮助,但是Mark Rajcok的另一个答案是我本来想要做的,但未能上班。显然,这里的父控制器form
不是ngForm
。
您可以使用指令上的属性来传递它,尽管这会变得很冗长。
例
这是一个工作的简化jsFiddle。
码
HTML:
<div ng-form="myForm">
<my-input form="myForm"></my-input>
</div>
指令的基本部分:
app.directive('myInput', function() {
return {
scope: {
form: '='
},
link: function(scope, element, attrs) {
console.log(scope.form);
}
};
});
发生了什么
我们已要求Angularform
通过使用来将属性中命名的范围值绑定到隔离的范围'='
。
这样做可以使实际形式与输入指令分离。
注意:我尝试使用require: "^ngForm"
,但是ngForm指令未定义控制器,因此不能以这种方式使用(太糟糕了)。
话虽如此,我认为这是处理该问题的非常冗长和混乱的方法。您最好将新指令添加到form元素,并用于require
访问该项目。我看看是否可以放一些东西。
编辑:使用父指令
好的,这是我可以使用父指令找出的最好的方法,我将在稍后解释:
使用父指令工作jsFiddle
HTML:
<div ng-app="myApp">
<div ng-form="theForm">
<my-form form="theForm">
<my-input></my-input>
</my-form>
</div>
</div>
JS(部分):
app.directive('myForm', function() {
return {
restrict: 'E',
scope: {
form: '='
},
controller: ['$scope', function($scope) {
this.getForm = function() {
return $scope.form;
}
}]
}
});
app.directive('myInput', function() {
return {
require: '^myForm',
link: function(scope, element, attrs, myForm) {
console.log(myForm.getForm());
}
};
});
这会将表单存储在父指令范围内(myForm
),并允许子指令通过要求父表格(require: '^myForm'
)并在链接函数(myForm.getForm()
)中访问指令的控制器来访问它。
好处:
- 您只需要在一个地方识别表格
- 您可以使用父控制器来存放通用代码
负面因素:
我想要的
我试图使用form元素上的属性使其工作。如果此方法可行,则只需将指令添加到与相同的元素ngForm
。
但是,我在使用范围时遇到了一些奇怪的行为,该myFormName
变量在中会是可见的$scope
,但是undefined
在我尝试访问它时会出现。那使我感到困惑。