Es scheint einige Möglichkeiten zu geben, zwischen Richtlinien zu kommunizieren. Angenommen, Sie haben verschachtelte Anweisungen, bei denen die inneren Anweisungen dem äußeren etwas mitteilen müssen (z. B. vom Benutzer ausgewählt).
<outer>
<inner></inner>
<inner></inner>
</outer>
Bisher habe ich 5 Möglichkeiten, dies zu tun
require:
übergeordnete Richtlinie
Die inner
Direktive kann die outer
Direktive erfordern , die eine Methode auf ihrem Controller verfügbar machen kann. Also in der inner
Definition
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
Und im outer
Controller der Direktive:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
Veranstaltung
Die inner
Direktive kann $emit
ein Ereignis sein, auf das die outer
Direktive über reagieren kann $on
. Also im inner
Controller der Direktive:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
und im outer
Direktiven Controller:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
Führen Sie den Ausdruck im übergeordneten Bereich über aus &
Das Element kann an einen Ausdruck im übergeordneten Bereich gebunden und an einer geeigneten Stelle ausgeführt werden. Das HTML wäre wie folgt:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
Der inner
Controller hat also eine 'innerChoose'-Funktion, die er aufrufen kann
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
Dies würde (in diesem Fall) die 'functionOnOuter'-Funktion für den outer
Geltungsbereich der Direktive aufrufen :
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Bereichsvererbung im nicht isolierten Bereich
Da es sich um verschachtelte Controller handelt, kann die Bereichsvererbung aktiv sein, und die innere Direktive kann nur Funktionen in der Bereichskette aufrufen, sofern sie keinen isolierten Bereich hat. Also in der inner
Richtlinie:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
Und in der outer
Richtlinie:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Durch Service in Innen und Außen gespritzt
Ein Dienst kann in beide Direktiven eingefügt werden, sodass sie direkten Zugriff auf dasselbe Objekt haben oder Funktionen aufrufen können, um den Dienst zu benachrichtigen, und sich möglicherweise sogar registrieren, um in einem Pub / Sub-System benachrichtigt zu werden. Dies erfordert nicht, dass die Direktiven verschachtelt sind.
Frage : Was sind mögliche Nachteile und Vorteile der beiden gegenüber den anderen?