Ma question consiste à savoir comment gérer l'imbrication complexe de modèles (également appelés partiels ) dans une application AngularJS.
La meilleure façon de décrire ma situation est avec une image que j'ai créée:
Comme vous pouvez le voir, cela peut être une application assez complexe avec beaucoup de modèles imbriqués.
L'application est d'une seule page, elle charge donc un index.html qui contient un élément div dans le DOM avec l' ng-view
attribut.
Pour le cercle 1 , vous voyez qu'il existe une navigation principale qui charge les modèles appropriés dans le ng-view
. Je fais cela en passant $routeParams
au module principal de l'application. Voici un exemple de ce qui se trouve dans mon application:
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' })
}]);
Dans le cercle 2 , le modèle chargé dans le ng-view
possède une sous-navigation supplémentaire . Cette sous-navigation doit ensuite charger des modèles dans la zone située en dessous - mais comme ng-view est déjà utilisé, je ne sais pas comment procéder.
Je sais que je peux inclure des modèles supplémentaires dans le 1er modèle, mais ces modèles vont tous être assez complexes. Je voudrais garder tous les modèles séparés afin de faciliter la mise à jour de l'application et ne pas avoir de dépendance sur le modèle parent devant être chargé pour accéder à ses enfants.
Dans le cercle 3 , vous pouvez voir que les choses deviennent encore plus complexes. Il est possible que les modèles de sous-navigation aient une 2e sous-navigation qui devra également charger ses propres modèles dans la zone du cercle 4
Comment procéder pour structurer une application AngularJS pour gérer une imbrication complexe de modèles tout en les gardant tous séparés les uns des autres?
la source
Réponses:
Eh bien, puisque vous ne pouvez actuellement avoir qu'une seule directive ngView ... J'utilise des contrôles de directive imbriqués. Cela vous permet de configurer des modèles et d'hériter (ou d'isoler) des étendues parmi eux. En dehors de cela, j'utilise ng-switch ou même juste ng-show pour choisir les contrôles que j'affiche en fonction de ce qui vient de $ routeParams.
EDIT Voici un exemple de pseudo-code pour vous donner une idée de ce dont je parle. Avec une sous-navigation imbriquée.
Voici la page principale de l'application
Directive pour la sous-navigation
modèle pour la sous-navigation
modèle pour une page principale (à partir de la navigation principale)
Contrôleur pour une page principale. (à partir de la navigation principale)
Directive pour une sous-zone
la source
MISE À JOUR: Découvrez le nouveau projet d'AngularUI pour résoudre ce problème
Pour les sous-sections, c'est aussi simple que d'utiliser les chaînes dans ng-include:
Ou vous pouvez créer un objet au cas où vous auriez des liens vers des sous-pages partout:
Ou vous pouvez même utiliser
$routeParams
Vous pouvez également mettre un ng-controller au niveau le plus haut de chaque partiel
la source
<div ng-include="'/home/' + tab + '.html'" ng-controller="SubCtrl"></div>
afin d'utiliser un contrôleur / portée distinct pour le sous-modèle. Ou spécifiez simplement langController
directive n'importe où dans vos sous-modèles pour utiliser un contrôleur différent pour chaque partiel.Vous pouvez également consulter cette bibliothèque dans le même but:
http://angular-route-segment.com
Il ressemble à ce que vous recherchez, et il est beaucoup plus simple à utiliser que ui-router. Depuis le site de démonstration :
JS:
HTML de premier niveau:
HTML imbriqué:
la source
Moi aussi, je me débattais avec des vues imbriquées dans Angular.
Une fois que j'ai mis la main sur ui-router, je savais que je ne retournerais jamais à la fonctionnalité de routage par défaut angulaire.
Voici un exemple d'application qui utilise plusieurs niveaux d'imbrication de vues
Comme on peut le voir, il y a 4 vues principales (view1, view2, view3, view4) et view1 a 3 vues enfant.
la source
$httpProvider
? Je ne le vois utilisé nulle part.Vous pouvez utiliser ng-include pour éviter d'utiliser des vues ng imbriquées.
http://docs.angularjs.org/api/ng/directive/ngInclude
http://plnkr.co/edit/ngdoc:example-example39@snapshot?p=preview
Ma page d'index j'utilise ng-view. Puis sur mes sous-pages dont j'ai besoin d'avoir des cadres imbriqués. J'utilise ng-include. La démo montre une liste déroulante. J'ai remplacé le mien par un lien ng-click. Dans la fonction, je mettrais $ scope.template = $ scope.templates [0]; ou $ scope.template = $ scope.templates [1];
la source
L'interface utilisateur angulaire prend en charge les vues imbriquées. Je ne l'ai pas encore utilisé mais semble très prometteur.
http://angular-ui.github.io/ui-router/
la source