Meine Frage betrifft den Umgang mit der komplexen Verschachtelung von Vorlagen (auch Partials genannt ) in einer AngularJS-Anwendung.
Ich beschreibe meine Situation am besten mit einem Bild, das ich erstellt habe:
Wie Sie sehen, kann dies eine ziemlich komplexe Anwendung mit vielen verschachtelten Modellen sein.
Die Anwendung ist einseitig und lädt daher eine index.html , die ein div-Element im DOM mit dem ng-view
Attribut enthält.
Für Kreis 1 sehen Sie, dass es eine primäre Navigation gibt, die die entsprechenden Vorlagen in die lädt ng-view
. Ich gehe $routeParams
dazu zum Haupt-App-Modul über. Hier ist ein Beispiel dafür, was in meiner App enthalten ist:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when("/job/:jobId/zones/:zoneId", { controller: JobDetailController, templateUrl: 'assets/job_list_app/templates/zone_edit.html' }).
when("/job/:jobId/initial_inspection", { controller: JobDetailController, templateUrl: 'assets/job_list_app/templates/initial_inspection.html' }).
when("/job/:jobId/zones/:zoneId/rooms/:roomId", { controller: JobDetailController, templateUrl: 'assets/job_list_app/templates/room_edit.html' })
}]);
In Kreis 2 verfügt die Vorlage, die in die geladen wird, ng-view
über eine zusätzliche Unternavigation . Dieses Sub-Navi muss dann Vorlagen in den Bereich darunter laden - aber da ng-view bereits verwendet wird, bin ich mir nicht sicher, wie ich das machen soll.
Ich weiß, dass ich zusätzliche Vorlagen in die erste Vorlage aufnehmen kann, aber diese Vorlagen werden alle ziemlich komplex sein. Ich möchte alle Vorlagen getrennt halten, damit die Anwendung einfacher aktualisiert werden kann und keine Abhängigkeit von der übergeordneten Vorlage besteht, die geladen werden muss, um auf ihre untergeordneten Vorlagen zugreifen zu können.
In Kreis 3 sehen Sie, wie die Dinge noch komplexer werden. Es besteht das Potenzial, dass die Subnavigationsvorlagen eine zweite Subnavigation haben , die auch ihre eigenen Vorlagen in den Bereich in Kreis 4 laden muss
Wie strukturiert man eine AngularJS-App, um mit solch komplexen Verschachtelungen von Vorlagen umzugehen und sie alle voneinander zu trennen?
quelle
Antworten:
Nun, da Sie derzeit nur eine ngView-Direktive haben können ... verwende ich verschachtelte Direktivensteuerelemente. Auf diese Weise können Sie Vorlagen einrichten und Bereiche zwischen diesen erben (oder isolieren). Abgesehen davon verwende ich ng-switch oder auch nur ng-show, um auszuwählen, welche Steuerelemente ich anzeigen möchte, basierend auf den Eingaben von $ routeParams.
BEARBEITEN Hier ist ein Beispiel für einen Pseudocode, der Ihnen eine Vorstellung davon gibt, wovon ich spreche. Mit einer verschachtelten Subnavigation.
Hier ist die Haupt-App-Seite
Richtlinie für die Subnavigation
Vorlage für die Subnavigation
Vorlage für eine Hauptseite (von der primären Navigation)
Controller für eine Hauptseite. (vom primären Navi)
Richtlinie für einen Unterbereich
quelle
UPDATE: Schauen Sie sich das neue Projekt von AngularUI an, um dieses Problem zu beheben
Für Unterabschnitte ist es so einfach wie das Verwenden von Zeichenfolgen in ng-include:
Oder Sie können ein Objekt erstellen, falls Sie überall Links zu Unterseiten haben:
Oder Sie können sogar verwenden
$routeParams
Sie können auch einen ng-Controller auf die oberste Ebene jedes Teils setzen
quelle
<div ng-include="'/home/' + tab + '.html'" ng-controller="SubCtrl"></div>
, um einen separaten Controller / Bereich für die Untervorlage zu verwenden. Oder geben Sie einfach diengController
Direktive an einer beliebigen Stelle in Ihren Untervorlagen an, um für jeden Teil einen anderen Controller zu verwenden.Sie können diese Bibliothek auch aus demselben Grund auschecken:
http://angular-route-segment.com
Es sieht so aus, wie Sie es suchen, und es ist viel einfacher zu bedienen als der UI-Router. Von der Demo-Site :
JS:
HTML der obersten Ebene:
Verschachteltes HTML:
quelle
Auch ich hatte mit verschachtelten Ansichten in Angular zu kämpfen.
Nachdem ich mir den UI-Router besorgt hatte, wusste ich, dass ich nie mehr zur Standard-Routing-Funktionalität zurückkehren würde.
Hier ist eine Beispielanwendung, die mehrere Ebenen von verschachtelten Ansichten verwendet
Wie zu sehen ist, gibt es 4 Hauptansichten (Ansicht1, Ansicht2, Ansicht3, Ansicht4) und Ansicht1 hat 3 untergeordnete Ansichten.
quelle
$httpProvider
? Ich sehe es nirgendwo benutzt.Sie können ng-include verwenden, um die Verwendung verschachtelter ng-Ansichten zu vermeiden.
http://docs.angularjs.org/api/ng/directive/ngInclude
http://plnkr.co/edit/ngdoc:example-example39@snapshot?p=preview
Meine Indexseite verwende ich ng-view. Dann auf meinen Unterseiten, die ich verschachtelte Frames haben muss. Ich benutze ng-include. Die Demo zeigt ein Dropdown. Ich habe meine durch einen Link ng-click ersetzt. In die Funktion würde ich $ scope.template = $ scope.templates [0] setzen; oder $ scope.template = $ scope.templates [1];
quelle
Angular UI-Router unterstützt verschachtelte Ansichten. Ich habe es noch nicht benutzt, sieht aber sehr vielversprechend aus.
http://angular-ui.github.io/ui-router/
quelle