イベントを発行したり、ディレクティブを親コントローラーにラップしたりする以外に、別のオプションがあります(これらのオプションに問題はありません)。もう1つのオプションは、任意のディレクティブコントローラーを登録し、それらの登録済みコントローラーを他の関連または非関連のディレクティブで使用できる汎用サービス/ファクトリを用意することです。
directiveCommunicator
以下に、ディレクティブコントローラを取得、設定、および設定解除できるというサービスがあります(必要に応じてファクトリを使用できますが、サービスを使用するのが私の好みです)。foo
次に、 andと呼ばれる別の2つbar
のディレクティブがあります。これらのfoo
ディレクティブは、使用するコントローラーを登録します。このコントローラーは、ディレクティブによって使用されbar
ます。foo
およびbar
ディレクティブは親/子に関連していないことに注意してください
// Service used to register/use any arbitrary controller
app.service('directiveCommunicator',
function()
{
var _controllers = {};
this.get =
function(id)
{
if (!(id in _controllers)) {
return null;
}
return _controllers[id];
};
this.set =
function(id, controller)
{
_controllers[id] = controller;
};
this.unset =
function(id)
{
if (!(id in _controllers)) {
return;
}
delete _controllers[i];
}
}
);
app.directive('foo',
[
'directiveCommunicator',
function(directiveCommunicator)
{
return {
'restrict': 'A',
'scope':
{
'colour': '='
},
'controller':
function($scope)
{
// We register out controller with a unique ID so we can use it in other directives
directiveCommunicator.set('colourBox', this);
// We also unregister it once we get destroyed, otherwise we'll be leaking memory
$scope.$on('$destroy',
function()
{
directiveCommunicator.unset('colourBox');
}
);
this.changeColour =
function(colour)
{
$scope.$apply(
function()
{
$scope._colour = colour;
}
);
}
},
'link':
function($scope, $element, $attr)
{
$scope._colour = $attr.colour;
$scope.$watch('_colour',
function()
{
$element.attr('class', $scope._colour);
}
);
}
}
}
]
);
app.directive('bar',
[
'directiveCommunicator',
function(directiveCommunicator)
{
return {
'restrict': 'A',
'scope':
{
'colour': '='
},
'link':
function($scope, $element, $attr)
{
$element.text($attr.colour);
$element.bind('click',
function()
{
// We get the registered controller and call the 'changeColour' method on it
var ctrl = directiveCommunicator.get('colourBox');
ctrl.changeColour($attr.colour);
}
);
}
}
}
]
);
Plunkerのデモを少し作成して、実際に見foo
てみbar
ました。ディレクティブは、foo
関連するコントローラーの背景を変更できる小さな正方形のdivです。は、のコントローラーメソッドを呼び出し、指定された属性に基づいて色を変更する、bar
関連のない別のディレクティブです。foo
changeColour
まだ本番環境でこのセットアップを使用しておらず、コントローラーの登録解除も処理する必要がありますが、機能するはずです。また、メソッドの3番目の引数をコントローラーのスコープにすることもできます。この引数は、directiveCommunicator.set
メソッドが$ destroy / unregisterセットアップに自動的に追加するため、これ以上呼び出す必要はありdirectiveCommunicator.unset
ません。