2つのディレクティブがあるmy-awesome-table
としましょうmy-awesome-table-cell
。ディレクティブmy-awesome-table-cell
の外で使用したくありません。my-awesome-table
これを強制する方法はありますか?my-awesome-table
ディレクティブの外で使用するとエラーがスローされるようにするには?
2 に答える
これを行うには、外部ディレクティブを取得して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) {
...
}
};
});
?^を使用して要件をオプションにし、リンク関数内で定義されているコントローラーパラメーターを確認して、これをきめ細かく制御することもできます。
これは、自分のコードを制御できることを前提として、問題にはならないはずです...ただし、問題になる状況では、リンク関数をチェックインして、ディレクティブが適切な親ディレクティブに含まれているかどうかを確認できます。
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も参照していない限り、JQuery LITEオブジェクトであり、完全なJQueryオブジェクトです。JQueryLiteには.parents()
機能がありません。引き続き親を確認できますが、可能であればここでJQueryを使用することをお勧めします。
知っておくべきもう1つのことはelem.remove()
、リンク関数でディレクティブを削除するために使用しない限り、エラーのあるディレクティブは引き続きレンダリングされることです。
また、replace:true
親ディレクティブで使用する場合は、呼び出しでクエリできるクラスや属性など、それを識別するためにテンプレートに何かを入れる必要がありますparent()
。