Nosso aplicativo possui navegação em 2 níveis. Queremos usar o AngularJS $routeProvider
para fornecer modelos dinamicamente para um <ng-view />
. Eu estava pensando em fazer algo parecido com isto:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:primaryNav/:secondaryNav', {
templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
});
}]);
Só não sei como preencher as partes dentro do <<>>
. Eu sei que o primaryNav e o secondaryNav são vinculados aos $ routeParams, mas como faço para acessar $ routeParams aqui para servir dinamicamente o modelo?
fonte
config()
apenas para provedores são passados, não instâncias de serviço reais, como$routePrams
.template
vez detemplateUrl
?template
para uma função, você pode passar$routeParams
para essa função:$routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });
. No entanto, você não pode definir dinamicamente um controlador desta forma :(Este recurso muito útil agora está disponível a partir da versão 1.1.2 do AngularJS. É considerado instável, mas eu usei (1.1.3) e funciona bem.
Basicamente, você pode usar uma função para gerar uma string templateUrl. A função recebe os parâmetros de rota que você pode usar para construir e retornar a string templateUrl.
Muito obrigado a https://github.com/lrlopez pela solicitação de pull.
https://github.com/angular/angular.js/pull/1524
fonte
controllers
...?templateUrl pode ser usado como função com retorno de URL gerado. Podemos manipular o url com a passagem do argumento que leva routeParams.
Veja o exemplo.
Espero essa ajuda.
fonte
Tudo bem, acho que entendi ...
Um pequeno histórico primeiro: O motivo pelo qual eu precisava disso era colocar o Angular no topo do Node Express e fazer com que Jade processasse meus parciais para mim.
Então aqui está o que você tem que fazer ... (beber cerveja e passar mais de 20 horas nela primeiro !!!) ...
Ao configurar seu módulo, salve
$routeProvider
globalmente:Isso pode ser mais informações do que o necessário ...
Basicamente, você vai querer armazenar a
$routeProvider
var do seu módulo globalmente, por exemplo, derouteProvider
forma que possa ser acessada por seus controladores.Então você pode apenas usar
routeProvider
e criar uma NOVA rota (você não pode 'RESET a rota' / 'REpromise'; você deve criar uma nova), eu apenas adicionei uma barra (/) no final para que seja tão semântica como o primeiro.Em seguida, (dentro do seu controlador), defina o
templateUrl
para a visualização que deseja atingir.Retire a
controller
propriedade do.when()
objeto, para não obter um loop infinito de solicitação.E por último (ainda dentro do Controller), use
$location.path()
para redirecionar para a rota que acabou de ser criada.Se você estiver interessado em como inserir um aplicativo Angular em um aplicativo Express, pode fazer um fork do meu repo aqui: https://github.com/cScarlson/isomorph .
E este método também permite que você mantenha as ligações de dados bidirecionais do AngularJS no caso de desejar vincular seu HTML ao seu banco de dados usando WebSockets: caso contrário, sem este método, suas ligações de dados angulares serão apenas impressas
{{model.param}}
.Se você clonar isso neste momento, precisará do mongoDB em sua máquina para executá-lo.
Espero que isso resolva o problema!
Cody
Não beba a água do banho.
fonte
Roteador:-
Controlador:-
Acredito que seja um ponto fraco do angularjs que $ routeParams NÃO seja visível dentro do roteador. Um pequeno aprimoramento faria uma grande diferença durante a implementação.
fonte
Eu adicionei suporte para isso no meu fork do angular. Permite que você especifique
https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934
não tenho certeza se isso vai ser detectado, pois é meio contra a corrente para angular, mas é útil para mim
fonte
em index.html
firstParam e secondParam podem ser qualquer coisa de acordo com suas necessidades.
fonte
Eu estava tendo um problema semelhante e usei em
$stateParams
vez derouteParam
fonte