Notre application dispose de 2 niveaux de navigation. Nous voulons utiliser AngularJS $routeProvider
pour fournir dynamiquement des modèles à un fichier <ng-view />
. Je pensais faire quelque chose du genre:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:primaryNav/:secondaryNav', {
templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
});
}]);
Je ne sais tout simplement pas comment remplir les parties dans le fichier <<>>
. Je sais que primaryNav et secondaryNav sont liés à $ routeParams, mais comment accéder à $ routeParams ici afin de servir dynamiquement le modèle?
la source
config()
sont transmises uniquement aux fournisseurs, pas aux instances de service réelles telles que$routePrams
.template
place detemplateUrl
?template
une fonction, vous pouvez passer$routeParams
dans cette fonction:$routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });
. Cependant, vous ne pouvez pas définir dynamiquement un contrôleur de cette façon :(Cette fonctionnalité très utile est désormais disponible à partir de la version 1.1.2 d'AngularJS. Il est considéré comme instable mais je l'ai utilisé (1.1.3) et cela fonctionne très bien.
En gros, vous pouvez utiliser une fonction pour générer une chaîne templateUrl. La fonction reçoit les paramètres d'itinéraire que vous pouvez utiliser pour générer et renvoyer la chaîne templateUrl.
Un grand merci à https://github.com/lrlopez pour la pull request.
https://github.com/angular/angular.js/pull/1524
la source
controllers
...?templateUrl peut être utilisé comme fonction avec le renvoi de l'URL générée. Nous pouvons manipuler l'url avec un argument passant qui prend routeParams.
Voir l'exemple.
J'espère que cette aide.
la source
Très bien, je pense que je l'ai compris ...
Petit rappel en premier: la raison pour laquelle j'en avais besoin était de coller Angular sur Node Express et de laisser Jade traiter mes partiels pour moi.
Alors, voici ce que je dois faire ... (boire de la bière et passer plus de 20 heures dessus en premier !!!) ...
Lorsque vous configurez votre module, enregistrez
$routeProvider
globalement:Cela peut être plus d'informations que ce qui était nécessaire ...
Fondamentalement, vous voudrez stocker
$routeProvider
globalement la variable de votre module , par exemplerouteProvider
pour qu'elle soit accessible par vos contrôleurs.Ensuite, vous pouvez simplement utiliser
routeProvider
et créer une NOUVELLE route (vous ne pouvez pas 'RESET a route' / 'REpromise'; vous devez en créer une nouvelle), j'ai juste ajouté une barre oblique (/) à la fin pour qu'elle soit aussi sémantique Comme le premier.Puis (à l'intérieur de votre contrôleur), réglez le
templateUrl
sur la vue que vous souhaitez atteindre.Supprimez la
controller
propriété de l'.when()
objet, de peur d'obtenir une boucle de requête infinie.Et enfin (toujours à l'intérieur du Controller), utilisez
$location.path()
pour rediriger vers la route qui vient d'être créée.Si vous souhaitez savoir comment appliquer une application Angular à une application Express, vous pouvez créer mon dépôt ici: https://github.com/cScarlson/isomorph .
Et cette méthode vous permet également de conserver les liaisons de données bidirectionnelles AngularJS au cas où vous voudriez lier votre HTML à votre base de données à l'aide de WebSockets: sinon, sans cette méthode, vos liaisons de données angulaires ne sortiront que
{{model.param}}
.Si vous le clonez à ce moment, vous aurez besoin de mongoDB sur votre machine pour l'exécuter.
J'espère que cela résout ce problème!
Cody
Ne buvez pas votre eau de bain.
la source
Routeur: -
Manette:-
Je crois que c'est une faiblesse dans angularjs que $ routeParams ne soit PAS visible à l'intérieur du routeur. Une petite amélioration ferait toute la différence pendant la mise en œuvre.
la source
J'ai ajouté un support pour cela dans mon fork de angular. Il vous permet de spécifier
https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934
Je ne suis pas sûr que cela soit repris car il est un peu à contre-courant pour angulaire, mais cela m'est utile
la source
dans index.html
firstParam et secondParam peuvent être n'importe quoi selon vos besoins.
la source
J'avais un problème similaire et utilisé à la
$stateParams
place derouteParam
la source