Kann mir jemand sagen, wie man einen Controller aus einer Direktive in eine andere angleJS-Direktive einbindet. Zum Beispiel habe ich den folgenden Code
var app = angular.module('shop', []).
config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/', {
templateUrl: '/js/partials/home.html'
})
.when('/products', {
controller: 'ProductsController',
templateUrl: '/js/partials/products.html'
})
.when('/products/:productId', {
controller: 'ProductController',
templateUrl: '/js/partials/product.html'
});
}]);
app.directive('mainCtrl', function () {
return {
controller: function ($scope) {}
};
});
app.directive('addProduct', function () {
return {
restrict: 'C',
require: '^mainCtrl',
link: function (scope, lElement, attrs, mainCtrl) {
//console.log(cartController);
}
};
});
Auf jeden Fall sollte ich in der addProduct-Direktive auf den Controller zugreifen können, bin es aber nicht. Gibt es einen besseren Weg, dies zu tun?
javascript
angularjs
angularjs-directive
Edgar Martinez
quelle
quelle
require
stellt das Vorhandensein einer anderen Richtlinie sicher und schließt dann deren Controller ein.^require
prüft zusätzlich zum aktuellen Element Elemente über dem aktuellen. Sie müssen also die beiden Anweisungen zusammen verwenden, damit dies funktioniert. Andernfalls definieren Sie einfach einen Controller mitapp.controller
und verwenden Sie ihn dann in beiden Anweisungen. Wie auch immer, können Sie dies zusammen mit Ihrem HTML-Code in einen einfachen Plunker einfügen?Antworten:
Ich hatte Glück und beantwortete dies in einem Kommentar zu der Frage, aber der Vollständigkeit halber poste ich eine vollständige Antwort, damit wir diese Frage als "Beantwortet" markieren können.
Dies hängt davon ab, was Sie durch die gemeinsame Nutzung eines Controllers erreichen möchten. Sie können entweder denselben Controller gemeinsam nutzen (obwohl Sie unterschiedliche Instanzen haben), oder Sie können dieselbe Controller-Instanz gemeinsam nutzen.
Teilen Sie einen Controller
Zwei Direktiven können denselben Controller verwenden, indem sie dieselbe Methode an zwei Direktiven übergeben:
Jede Direktive erhält eine eigene Instanz des Controllers. Auf diese Weise können Sie die Logik jedoch auf beliebig viele Komponenten verteilen.
Benötigen Sie einen Controller
Wenn Sie dieselbe Instanz eines Controllers gemeinsam nutzen möchten , verwenden Sie
require
.require
stellt das Vorhandensein einer anderen Direktive sicher und schließt dann deren Controller als Parameter für die Verbindungsfunktion ein. Wenn Sie also zwei Direktiven für ein Element haben, kann Ihre Direktive das Vorhandensein der anderen Direktive erfordern und Zugriff auf ihre Controller-Methoden erhalten. Ein häufiger Anwendungsfall hierfür ist das ErfordernisngModel
.^require
Überprüft mit dem Caret zusätzlich zum aktuellen Element die Elemente über der Direktive, um zu versuchen, die andere Direktive zu finden. Auf diese Weise können Sie komplexe Komponenten erstellen, bei denen "Unterkomponenten" über die Steuerung mit der übergeordneten Komponente effektiv kommunizieren können. Beispiele könnten Registerkarten sein, in denen jeder Bereich mit den gesamten Registerkarten kommunizieren kann, um das Umschalten zu handhaben. Ein Akkordeonset könnte sicherstellen, dass jeweils nur eines geöffnet ist. etc.In beiden Fällen müssen Sie die beiden Anweisungen zusammen verwenden, damit dies funktioniert.
require
ist eine Art der Kommunikation zwischen Komponenten.Weitere Informationen finden Sie auf der Leitfadenseite der Richtlinien: http://docs.angularjs.org/guide/directive
quelle
require
eine einzelne Direktive oder ein Array von Direktiven angeben. Jeder Direktive kann ein Caret (^
) vorangestellt werden, um genauere Anforderungen zu erfüllen.)Hier gibt es eine gute Stackoverflow-Antwort von Mark Rajcok:
AngularJS-Direktiven-Controller, die übergeordnete Direktiven-Controller benötigen?
mit einem Link zu dieser sehr klaren jsFiddle: http://jsfiddle.net/mrajcok/StXFK/
JavaScript
quelle