Nuestra aplicación tiene navegación de 2 niveles. Queremos usar AngularJS $routeProvider
para proporcionar dinámicamente plantillas a un <ng-view />
. Estaba pensando en hacer algo como esto:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:primaryNav/:secondaryNav', {
templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
});
}]);
Simplemente no sé cómo poblar las partes dentro del <<>>
. Sé que el primaryNav y el secundarioNav se vinculan a $ routeParams, pero ¿cómo accedo a $ routeParams aquí para servir dinámicamente la plantilla?
fuente
config()
se pasan los objetivos de inyección solo a los proveedores, no a instancias de servicio reales como$routePrams
.template
lugar detemplateUrl
?template
a una función, se puede pasar$routeParams
a esa función:$routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });
. Sin embargo, no puede definir dinámicamente un controlador de esta manera :(Esta función muy útil ahora está disponible a partir de la versión 1.1.2 de AngularJS. Se considera inestable pero lo he usado (1.1.3) y funciona bien.
Básicamente, puede usar una función para generar una cadena templateUrl. A la función se le pasan los parámetros de ruta que puede usar para construir y devolver la cadena templateUrl.
Muchas gracias a https://github.com/lrlopez por la solicitud de extracción.
https://github.com/angular/angular.js/pull/1524
fuente
controllers
...?templateUrl se puede utilizar como función para devolver la URL generada. Podemos manipular la URL con un argumento de paso que toma routeParams.
Vea el ejemplo.
Espero que esto ayude.
fuente
Está bien, creo que lo tengo ...
Primero un poco de fondo: la razón por la que necesitaba esto era colocar Angular encima de Node Express y hacer que Jade procesara mis parciales por mí.
Así que esto es lo que tienes que hacer ... (¡bebe cerveza y pasa más de 20 horas en ella primero!) ...
Cuando configure su módulo, guarde
$routeProvider
globalmente:Eso puede ser más información de la que se necesitaba ...
Básicamente, querrá almacenar la
$routeProvider
var de su módulo globalmente, por ejemplo,routeProvider
para que sus controladores puedan acceder a él.Luego, puede usar
routeProvider
y crear una ruta NUEVA (no puede 'RESTABLECER una ruta' / 'REpromise'; debe crear una nueva), acabo de agregar una barra (/) al final para que sea tan semántica como el primero.Luego (dentro de su controlador), configure
templateUrl
la vista a la que desea acceder.Elimina la
controller
propiedad del.when()
objeto, no sea que obtengas un bucle de solicitud infinito.Y finalmente (aún dentro del controlador), use
$location.path()
para redirigir a la ruta que acaba de crear.Si está interesado en cómo colocar una aplicación Angular en una aplicación Express, puede bifurcar mi repositorio aquí: https://github.com/cScarlson/isomorph .
Y este método también le permite mantener las vinculaciones de datos bidireccionales de AngularJS en caso de que desee vincular su HTML a su base de datos utilizando WebSockets: de lo contrario, sin este método, sus vinculaciones de datos angulares solo se generarán
{{model.param}}
.Si clona esto en este momento, necesitará mongoDB en su máquina para ejecutarlo.
¡Espero que esto resuelva este problema!
Cody
No beba el agua de su baño.
fuente
Enrutador: -
Controlador:-
Creo que es una debilidad en angularjs que $ routeParams NO sea visible dentro del enrutador. Una pequeña mejora marcaría una gran diferencia durante la implementación.
fuente
He agregado soporte para esto en mi bifurcación de angular. Te permite especificar
https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934
No estoy seguro de que esto se recoja ya que es un poco contra el grano para angular, pero es útil para mí
fuente
en index.html
firstParam y secondParam pueden ser cualquier cosa según sus necesidades.
fuente
Tenía un problema similar y usé en
$stateParams
lugar derouteParam
fuente