假设我有两个指令,my-awesome-table
和my-awesome-table-cell
。我从不希望在my-awesome-table-cell
指令之外使用my-awesome-table
。有没有办法强制执行此操作?因此在my-awesome-table
指令之外使用时会抛出错误吗?
答案 0 :(得分:5)
您也可以通过获取外部指令将“控制器指令”放在DOM上,然后使内部指令“需要”此“控制器指令”来执行此操作。
请参阅此插件:http://plnkr.co/edit/QPNPu4。
app.directive('myAwesomeTable', function() {
return {
controller: function($scope) {},
link: function(scope, element) {
...
}
};
});
app.directive('myAwesomeTableCell', function() {
return {
require: '^myAwesomeTable',
link: function(scope, element, attributes, controller) {
...
}
};
});
您还可以使用?^将需求设置为可选,然后在链接函数内部检查要定义的控制器参数,如果您想对此进行细粒度控制。
答案 1 :(得分:1)
这不应该是一个问题,假设您可以控制自己的代码......但是,在这种情况下它成为一个问题,您可以检查您的链接功能,看看您的指令是否包含在正确的父指令:
app.directive('testChild', function() {
return {
restrict: 'E',
template: '<div>child</div>',
link: function(scope, elem, attr){
if(elem.parents('test').length === 0) {
throw new Error('Must be inside test directive');
}
}
};
});
app.directive('test', function(){
return {
restrict: 'E',
transclude: true,
template: '<div>' +
'<h3>parent</h3>' +
'<div ng-transclude></div>' +
'</div>'
};
});
测试加价:
<test>
<test-child></test-child>
<test-child></test-child>
</test>
<!-- this will throw an error in JS -->
<test-child></test-child>
备注强>
链接函数中的elem
参数是一个JQuery LITE对象,除非你也引用了JQuery,那么它就是一个完整的JQuery对象。 JQuery Lite没有.parents()
函数。您仍然可以检查父母,但如果可能,我建议您在这里使用JQuery。
要知道的另一件事是错误的指令仍然会呈现,除非你使用elem.remove()
来解除链接函数中的错误。
此外,如果您在父指令上使用replace:true
,则需要在其模板中放置一些内容以识别它,就像您可以使用parent()
查询的类或属性一样调用