编辑 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 指令没有定义控制器,并且不能以这种方式使用(这太糟糕了)。
话虽如此,我认为这是一种非常冗长和混乱的处理方式。您最好向表单元素添加一个新指令,并使用它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()
) 中访问指令的控制器。
好处:
- 您只需要在一个地方识别表格
- 您可以使用您的父控制器来存放公共代码
负面:
我更喜欢什么
我试图使用表单元素上的属性让它工作。如果这有效,您只需将该指令添加到与ngForm
.
但是,我在范围内遇到了一些奇怪的行为,myFormName
变量将在 内可见$scope
,但是undefined
当我尝试访问它时。那个让我很困惑。