Minha pergunta envolve como lidar com o aninhamento complexo de modelos (também chamados de parciais ) em um aplicativo AngularJS.
A melhor maneira de descrever minha situação é com uma imagem que eu criei:
Como você pode ver, isso tem o potencial de ser um aplicativo bastante complexo com muitos modelos aninhados.
O aplicativo é de página única, portanto, carrega um index.html que contém um elemento div no DOM com o ng-view
atributo
Para o círculo 1 , você vê que existe uma navegação Primária que carrega os modelos apropriados no ng-view
. Estou fazendo isso passando $routeParams
para o módulo principal do aplicativo. Aqui está um exemplo do que está no meu aplicativo:
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' })
}]);
No círculo 2 , o modelo carregado na ng-view
possui uma subavegação adicional . Essa sub-navegação precisa carregar modelos na área abaixo dela - mas como o ng-view já está sendo usado, não tenho certeza de como fazê-lo.
Eu sei que posso incluir modelos adicionais no primeiro modelo, mas todos eles serão bastante complexos. Gostaria de manter todos os modelos separados para facilitar a atualização do aplicativo e não ter uma dependência do modelo pai que precisa ser carregado para acessar seus filhos.
No círculo 3 , você pode ver as coisas ficarem ainda mais complexas. Existe o potencial de que os modelos de subavegação tenham uma segunda subavegação que precisará carregar seus próprios modelos também na área do círculo 4
Como estruturar um aplicativo AngularJS para lidar com esse complexo aninhamento de modelos, mantendo-os todos separados um do outro?
fonte
Respostas:
Bem, como atualmente você pode ter apenas uma diretiva ngView ... eu uso controles de diretiva aninhados. Isso permite configurar modelos e herdar (ou isolar) escopos entre eles. Fora isso, uso o ng-switch ou até apenas o ng-show para escolher quais controles serão exibidos com base no que está vindo de $ routeParams.
EDIT Aqui está um exemplo de pseudo-código para lhe dar uma idéia do que estou falando. Com uma subnavegação aninhada.
Aqui está a página principal do aplicativo
Directiva para a sub-navegação
modelo para a sub navegação
modelo para uma página principal (da navegação principal)
Controlador para uma página principal. (da navegação principal)
Diretiva para uma subárea
fonte
ATUALIZAÇÃO: Confira o novo projeto do AngularUI para solucionar esse problema
Para subseções, é tão fácil quanto aproveitar as strings no ng-include:
Ou você pode criar um objeto caso tenha links para subpáginas em todo o lugar:
Ou você pode até usar
$routeParams
Você também pode colocar um ng-controller no nível mais alto de cada
fonte
<div ng-include="'/home/' + tab + '.html'" ng-controller="SubCtrl"></div>
para usar um controlador / escopo separado para o submodelo. Ou apenas especifique angController
diretiva em qualquer lugar dentro dos seus sub-modelos para usar um controlador diferente para cada parcial.Você também pode fazer o check-out desta biblioteca com a mesma finalidade:
http://angular-route-segment.com
Parece o que você está procurando e é muito mais simples de usar que o roteador da interface do usuário. No site de demonstração :
JS:
HTML de nível superior:
HTML aninhado:
fonte
Eu também estava lutando com vistas aninhadas no Angular.
Depois que eu peguei o ui-router , sabia que nunca mais voltaria à funcionalidade de roteamento angular padrão.
Aqui está um exemplo de aplicativo que usa vários níveis de visualização de aninhamento
Como pode ser visto, existem 4 visualizações principais (view1, view2, view3, view4) e view1 possui 3 visualizações filho.
fonte
$httpProvider
? Não o vejo usado em lugar nenhum.Você pode usar ng-include para evitar o uso de visualizações ng aninhadas.
http://docs.angularjs.org/api/ng/directive/ngInclude
http://plnkr.co/edit/ngdoc:example-example39@snapshot?p=preview
Minha página de índice eu uso o ng-view. Em seguida, nas minhas subpáginas, que eu preciso ter quadros aninhados. Eu uso ng-include. A demonstração mostra uma lista suspensa. Substituí o meu por um link ng-click. Na função eu colocaria $ scope.template = $ scope.templates [0]; ou $ scope.template = $ scope.templates [1];
fonte
O ui-router angular suporta visualizações aninhadas. Ainda não o usei, mas parece muito promissor.
http://angular-ui.github.io/ui-router/
fonte