In Angular, wie JSON-Objekt / Array in Direktive übergeben?
Derzeit ist meine app hat ein controller braucht, in eine JSON-Datei iteriert dann über Sie mittels "ng-repeat". Das ist alles ganz toll arbeiten, aber ich habe auch eine Richtlinie, die braucht Sie zum Durchlaufen der gleichen JSON-Datei. Dies stellt ein problem, da ich nicht verlangen die gleichen JSON-Datei zweimal auf einer Seite (noch würde ich wollen, denn es wäre ineffizient). Sowohl die Richtlinie und controller Antrag und Durchlaufen werden, die JSON-Daten nur in Ordnung, wenn ich den Dateinamen zu ändern, der eine der JSON-Dateien.
Was ich Frage ist: was ist der beste Weg zu gehen über die übergabe der array gebildet, von meinem controller JSON-Anforderung in der Richtlinie? Wie kann ich das array übergeben in meine Richtlinie und Durchlaufen, wenn ich schon zugegriffen es über meinen controller?
Controller
appControllers.controller('dummyCtrl', function ($scope, $http) {
$http.get('locations/locations.json').success(function(data) {
$scope.locations = data;
});
});
HTML
<ul class="list">
<li ng-repeat="location in locations">
<a href="#">{{location.id}}. {{location.name}}</a>
</li>
</ul>
<map></map> //executes a js library
- Richtlinie (Funktioniert, wenn ich einen Datei-Namen neben Standorten.json, da hab ich schon angefragt, die es einmal
.directive('map', function($http) {
return {
restrict: 'E',
replace: true,
template: '<div></div>',
link: function(scope, element, attrs) {
$http.get('locations/locations.json').success(function(data) {
angular.forEach(data.locations, function(location, key){
//do something
});
});
InformationsquelleAutor der Frage Omegalen | 2014-02-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, Folgen Sie den "best practices" es gibt ein paar Dinge, die ich empfehlen würde, von denen einige betroffen sind, die in anderen Antworten und Kommentare auf diese Frage.
Erste, während es nicht zu viel Einfluss auf die spezifische Frage, die Sie gefragt, Sie habe erwähnt, Effizienz, und der beste Weg, um Griff auf freigegebene Daten in Ihrem Antrag ist der Faktor, der es sich in einem Dienst.
Ich würde persönlich empfehlen umarmen AngularJS ist Versprechen systemdie Ihren asynchronen Dienste mehr composable im Vergleich zu raw-Rückrufe. Zum Glück, Eckig ist
$http
service Sie bereits verwendet unter der Haube. Hier ist ein service, der zurückkehren wird, ein Versprechen, löst die Daten aus der JSON-Datei; aufrufen der service mehr als einmal nicht zu einem zweiten HTTP-Anforderung.So weit wie immer Sie die Daten in Ihre Richtlinie, es ist wichtig, daran zu erinnern, dass Richtlinien sind entworfen, um die abstrakte generische DOM-manipulation; Sie sollten nicht injizieren Sie mit Applikations-spezifischen Dienstleistungen. In diesem Fall wäre es verlockend, einfach injizieren die
locations
service in der Richtlinie, aber diese Paare die Richtlinie zu, dass die service.In diesem speziellen Fall, sollten Sie die entsprechenden Daten auf dem controller - Rahmen und teilen Sie es mit der Richtlinie über ein Attribut.
In dieser Art und Weise, die
map
Richtlinie kann verwendet werden, mit alle Reihe von Standort-Daten--die Richtlinie ist nicht hart-codiert, um eine bestimmte Menge von Daten, und die Verknüpfung einfach die Richtlinie, indem Sie ihn in das DOM wird nicht Feuer aus zufälligen HTTP-Anfragen.InformationsquelleAutor der Antwort Michelle Tilley
Als Sie sagen, Sie brauchen nicht zu verlangen, die Datei zweimal. Übergeben Sie es von Ihrem controller auf Ihre Richtlinie. Angenommen, Sie verwenden die Richtlinie innerhalb der scope des Controllers:
Dann in Ihrem HTML (wo Sie rufen die Richtlinie).
Hinweis:
locations
ist ein Verweis auf Ihre Controller$scope.locations
.Und schließlich in Ihrer Richtlinie
Dies ist nur eine Gliederung, um Sie in die richtige Richtung, es ist also unvollständig und nicht geprüft.
InformationsquelleAutor der Antwort KG Christensen
Was Sie brauchen, ist richtig-service:
Den
locations
wäre-Cache auf dem Dienst, arbeitete als singleton-Modell. Dies ist der richtige Weg, um Daten abrufen.Diesen service nutzen
DataLayer
im controller und der Richtlinie ist ok, wie folgt:InformationsquelleAutor der Antwort Howard