Direktifler arasında iletişim kurmanın birkaç yolu var gibi görünüyor. İç direktiflerin dışa bir şey iletmesi gereken iç içe direktifleriniz olduğunu söyleyin (örneğin, kullanıcı tarafından seçildi).
<outer>
<inner></inner>
<inner></inner>
</outer>
Şimdiye kadar bunu yapmanın 5 yolu var
require:
ana direktif
inner
Yönergesi gerektirebilir outer
kendi denetleyicisi bazı yöntemi maruz bırakabilir yönergesini. Yani inner
tanımında
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
Ve outer
direktifin kontrolünde:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
Etkinlik
inner
Yönerge can $emit
bir olay, outer
direktif yoluyla yanıt verebilir $on
. Yani inner
direktifin kontrolünde:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
ve outer
direktif kontrolünde:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
Üst kapsamdaki ifadeyi, üzerinden yürüt &
Öğe, ana kapsamdaki bir ifadeye bağlanabilir ve uygun bir noktada yürütebilir. HTML şöyle olurdu:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
Böylece inner
kontrolör çağırabileceği bir 'innerChoose' işlevine sahiptir.
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
(bu durumda) outer
direktifin kapsamındaki 'functionOnOuter' işlevini çağırır :
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
İzole edilmeyen kapsamda kapsam devralma
Bunların iç içe denetleyiciler olduğu göz önüne alındığında, kapsam devralma iş başında olabilir ve iç yönerge, yalıtılmış bir kapsamı olmadığı sürece, kapsam zincirindeki tüm işlevleri çağırabilir). Yani inner
direktifte:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
Ve outer
direktifte:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Hem iç hem de dışa servis enjekte edilerek
Bir servis her iki yönetmeliğe de enjekte edilebilir, böylece aynı nesneye doğrudan erişebilir veya servisi bildirmek için işlevleri çağırabilir ve hatta bir pub / alt sisteme bildirilmek için kendilerini kaydettirebilirler. Bu, direktiflerin iç içe geçmesini gerektirmez.
Soru : Her birinin diğerlerine göre potansiyel sakıncaları ve avantajları nelerdir?