Eu quero saber é como usar vários controladores para um único aplicativo de página. Eu tentei descobrir e encontrei perguntas muito semelhantes às minhas, mas há apenas uma tonelada de respostas diferentes resolvendo um problema específico em que você acaba não usando vários controladores para um único aplicativo de página.
É porque não seria sensato usar vários controladores para uma única página? Ou simplesmente não é possível?
Digamos que eu já tenha um controlador de carrossel de imagens incrível trabalhando na página principal, mas depois aprendo a (digamos) usar modais e preciso de um novo controlador para isso também (ou qualquer outra coisa que precise de um controlador). O que vou fazer então?
Eu vi algumas respostas a outras perguntas onde eles perguntam quase as mesmas coisas que eu e as pessoas respondem "* OMG. Por que você faria isso, apenas faça isso ...".
Qual é a melhor maneira ou como você faz isso?
Editar
Muitos de vocês estão respondendo apenas para declarar dois controladores e usar o ng-controller para chamá-los. Eu uso este trecho de código abaixo e chamo MainCtrl com ng-controller.
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: "templates/main.html",
controller:'MainCtrl',
})
.otherwise({
template: 'does not exists'
});
});
Por que preciso definir um controlador aqui se posso apenas usar o ng-controlador sem ele? Isso é o que me confundiu. (e você não pode adicionar dois controladores desta forma, eu acho ...)
fonte
when: /home, controller: MainCtrl
. não pode adicionar mais do que isso, ou você quer apenas chamá-lo com o ng-controlador?Respostas:
Qual é o problema? Para usar vários controladores, basta usar várias diretivas ngController:
Você precisará ter os controladores disponíveis em seu módulo de aplicação, como de costume.
A maneira mais básica de fazer isso pode ser tão simples quanto declarar as funções do controlador como esta:
fonte
when /home, controller: MainCtrl
ng-controller
de vários elementos DOM é, digamos, em um cenário onde há MUITOS itens sendo impressos no DOM viang-repeat
. Digamos que cada um desses faça uma chamada parang-controller="myController
. De alguns dos logs de console que vi em meu aplicativo,myController
reinicializa com CADA elemento sendo renderizado no DOM que o chama ... Talvez eu tenha estragado algo em meu uso específico, ou talvez além do escopo dos OPs questão, mas curioso se outros já experimentaram isso ...Acho que está faltando o significado de "aplicativo de página única".
Isso não significa que você terá fisicamente um .html, em vez disso, terá um
index.html
arquivo principal e vários arquivos .html NESTED. Então, por que um aplicativo de página única? Porque desta forma você não carrega as páginas da maneira padrão (ou seja, uma chamada de navegador que atualiza completamente a página inteira), mas apenas carrega a parte do conteúdo usando Angular / Ajax. Como você não vê a oscilação entre as mudanças de página, tem a impressão de que não saiu da página. Assim, você sente que está permanecendo em uma única página.Agora, estou assumindo que você deseja ter MÚLTIPLOS conteúdos para o seu aplicativo de ÚNICA PÁGINA: (por exemplo) casa, contatos, portfólio e loja. Seu aplicativo de página única / conteúdo múltiplo (a maneira angular) será organizado desta forma:
index.html
: contém cabeçalho<ng-view>
e rodapécontacts.html
: contém o formulário de contato (sem cabeçalho, sem rodapé)portfolio.html
: contém os dados do portfólio (sem cabeçalho e rodapé)store.html
: contém a loja, sem cabeçalho e rodapé.Você está no índice, clica no menu chamado “contatos” e o que acontece? Angular substitui a
<ng-view>
tag pelocontacts.html
códigoComo você consegue isso? com
ngRoute
, como você está fazendo, você terá algo como:Isso irá chamar o html certo passando o controlador certo para ele (por favor, note: não especifique a
ng-controller
diretivacontacts.html
se você estiver usando rotas )Então, é claro, você pode declarar quantas diretivas ng-controller dentro de sua página contacts.html. Esses serão controladores filhos de
ContactCtrl
(herdando assim). Mas para uma única rota, dentro dorouteProvider
, você pode declarar um único Controlador que atuará como o "Controlador pai da visão parcial".EDITAR Imagine os seguintes templates / contacts.html
o acima
routeProvider
irá injetar um controlador em seu div. Basicamente, o html acima torna-se automaticamente:Quando digo que você pode ter outros controladores, significa que você pode conectar controladores a elementos DOM internos, da seguinte forma:
Espero que isso esclareça um pouco as coisas.
UMA
fonte
<div ng-controller="FancyStuffController">
dentro de uma tag de corpo que já tenha um controlador aplicado a ela, por exemplo,<body ng-controller="BodyController">
isso funcionará? Estou recebendo erros sobre$apply already in progress
quando faço isso, mas acho que está relacionado ao dpd.js. Para não entrar nisso, acho que é apenas carregá-lo duas vezes ou algo assim, não tenho certeza como, mas meu uso do controlador pode estar tentando recarregar isso.Atualmente, estou no processo de construção de um aplicativo de página única. Aqui está o que eu tenho até agora que acredito que estaria respondendo à sua pergunta. Eu tenho um modelo base (base.html) que tem uma div com a
ng-view
diretiva nele. Essa diretiva informa ao angular onde colocar o novo conteúdo. Observe que também sou novo no angularjs, portanto, de forma alguma estou dizendo que essa é a melhor maneira de fazer isso.base.html
fonte
when /home
when
's. Quero dois controladores para um único modelo. Ou maby eu entendi mal o que você estava tentando me dizer?menuController tem acesso ao menu div. E widgetController tem acesso a ambos.
fonte
Podemos simplesmente declarar mais de um controlador no mesmo módulo. Aqui está um exemplo:
fonte
Acabei de colocar uma declaração simples do aplicativo
Então criei um serviço e dois controladores
Para cada controlador eu tinha uma linha no JS
E no HTML eu declarei o escopo do aplicativo em um div circundante
e cada escopo do controlador separadamente em seu próprio div circundante (dentro do div do aplicativo)
Isso funcionou bem
fonte
Você também pode ter embutido todas as suas visualizações de modelo em seu arquivo html principal. Por exemplo:
Dessa forma, se cada modelo exigir um controlador diferente, você ainda poderá usar o roteador angular. Veja este plunk para um exemplo funcional http://plnkr.co/edit/9X0fT0Q9MlXtHVVQLhgr?p=preview
Dessa forma, uma vez que o aplicativo é enviado do servidor para o seu cliente, ele é completamente independente, supondo que não precise fazer nenhuma solicitação de dados, etc.
fonte