Router iron-router
- https://github.com/iron-meteor/iron-router
- http://iron-meteor.github.io/iron-router
- http://fr.discovermeteor.com/chapters/routing/
- http://robertdickert.com/blog/2014/05/08/iron-router-first-steps/
- http://stackoverflow.com/questions/tagged/iron-router
Installation
$ meteor add iron:router
Dépendances:
// main namespace and utils
// https://github.com/iron-meteor/iron-core
iron:core
// ui layout
// https://github.com/iron-meteor/iron-layout
iron:layout
// connect like middleware stack for client/server
// https://github.com/iron-meteor/iron-middleware-stack
iron:middleware-stack
// client and server side url utilities and compiling
// https://github.com/iron-meteor/iron-url
iron:url
// for reactive urls and pushState in the browser
// https://github.com/iron-meteor/iron-location
iron:location
// for RouteController which inherits from this
// https://github.com/iron-meteor/iron-controller
iron:controller
Les différentes façon de déclarer et gérer des routes
// La plus simple: cherchera un template name="home" et la route pourra être nommé "home"
// Dans un template, la route pourra être appellé avec {{pathFor route='home'}}
Router.route('/home');
// Même chose mais en changeant des options comme le nom de la route
// Le template devra s'appellé myhome
// Dans un template, la route sera appellé avec {{pathFor route='myhome'}}
Router.route('/home', {name: "myhome"});
// Définit dans une fonction
Router.route('/home', function () {
this.render('home');
});
// Fonction et options
Router.route('/home', function () {
this.render('home');
}, {
name: 'myhome'
});
Tous les paramètres de Router.route()
Router.route('/post/:_id', {
name: 'post.show',
path: '/post/:_id',
controller: 'CustomController',
template: 'Post',
layoutTemplate: 'ApplicationLayout',
yieldRegions: {
'MyAside': {to: 'aside'},
'MyFooter': {to: 'footer'}
},
subscriptions: function() {
this.subscribe('items');
this.subscribe('item', this.params._id).wait();
},
waitOn: function () {
return Meteor.subscribe('post', this.params._id);
},
data: function () {
return Posts.findOne({_id: this.params._id});
},
onRun: function () {},
onRerun: function () {},
onBeforeAction: function () {},
onAfterAction: function () {},
onStop: function () {},
action: function () {
this.render();
}
});
Options par défaut pour toutes les routes
Tous les paramètres de Router.route() peuvent être définit avec une valeur par défaut dans:
Router.configure({
layoutTemplate: 'ApplicationLayout',
});
Hooks
onBeforeAction
Router.onBeforeAction(function() {
if (! Meteor.userId()) {
this.render('login');
} else {
this.next();
}
});
Plugins
Tips
Trouver le nom de la route en cours
Router.current().route.getName()
Extensions Iron-Router
Les extensions marqués d'un (*) sont ceux que je considère comme les plus utiles.
iron-dynamic-template
- https://github.com/iron-meteor/iron-dynamic-template
iron-router-auth (*)
- https://atmospherejs.com/zimme/iron-router-auth
$ meteor add zimme:iron-router-auth
- Définir routes public/privés: (dans client/views/router.js)
> ou avec https://github.com/zimme/meteor-iron-router-auth
var publicRoutes = ["home_public", "login", "register", "forgot_password", "reset_password"];
var privateRoutes = ["applications", "applications.insert", "applications.edit", "applications.details", "applications.details.form_view", "applications.details.sitemap", "applications.details.database", "applications.details.json_view", "applications.details.console", "admin", "admin.users", "admin.users.details", "admin.users.insert", "admin.users.edit", "user_settings", "user_settings.profile", "user_settings.change_pass", "logout"];
var zonelessRoutes = ["getting_started", "examples", "api_reference", "version_history", "contribute", "donate"];
- Et utiliser hook (exemple site kitchen)
Router.onBeforeAction(Router.ensureNotLogged, {only: publicRoutes});
Router.onBeforeAction(Router.ensureLogged, {only: privateRoutes});
iron-router-progress (*)
Affiche une barre de progression ou un spinner d'attente.
- https://atmospherejs.com/multiply/iron-router-progress
$ meteor add multiply:iron-router-progress
iron-router-breadcrumb (*)
- https://atmospherejs.com/monbro/iron-router-breadcrumb
- http://meteor-breadcrumb-plugin-basic-example.meteor.com/
A l'aide des paramètres supplémentaires "parent" et "title" dans la définition des routes, permet d'avoir une barre:
# Pour le lien: /dashboard/analytics/books
Dashboard / Analytics / Category Books
Non dépendant de Bootstrap
$ meteor add monbro:iron-router-breadcrumb
iron-router-i18n (*)
Internationalisation des routes.
- https://atmospherejs.com/martino/iron-router-i18n
- https://atmospherejs.com/martino/i18n-conf
$ meteor add martino:iron-router-i18n
$ meteor add martino:i18n-conf
iron-router-ga
Aide à la création de routes personnalisés pour Google Analytic
- https://atmospherejs.com/reywood/iron-router-ga
- https://github.com/reywood/meteor-iron-router-ga/
$ meteor add reywood:iron-router-ga
iron-router-autoscroll
TODO: Comprendre l'usage
- https://atmospherejs.com/okgrow/iron-router-autoscroll
Souscription
Plusieurs méthodes
Idée: définir un controlleur global à hérité et y placer des subscribe commun comme les Users
Dans un Router.route
Router.route('/post/:_id', {
subscriptions: function() {
this.subscribe('items');
this.subscribe('item', this.params._id).wait();
},
});
waitOn vs subscriptions
- L'avantage de waitOn est d'y placer aussi d'autres attente (wait) que les souscriptions
waitOn: function () {
return Meteor.subscribe('post', this.params._id);
},
Dans un controlleur
PostController = RouteController.extend();
- http://www.manuel-schoebel.com/blog/meteorjs-iron-router-filters-before-and-after-hooks
// Hook onBeforeAction
Router.map(function () {
this.route('postShow', {
path: '/posts/:_id',
onBeforeAction: function (pause) {
if (!Meteor.user()) {
// render the login template but keep the url in the browser the same
this.render('login');
}
}
}
Tips - Parcourir les routes pour générer un menu
Template.mobileLayout.helpers({
sidebarLinks: function(){
var links = new Array();
_.each(Router.routes, function(r){
console.log(r);
if( r.options.hasOwnProperty('label') &&
r.options.hasOwnProperty('icon') ){
links.push({
routeName: r.name,
label: r.options.label,
icon: r.options.icon
});
}
});
return links;
}
});
Tips - Tracer les routes
- https://github.com/okgrow/analytics/blob/master/lib/meteor-analytics.js
if (Package['iron:router']) {
Package['iron:router'].Router.onRun(function() {
var router = this;
Tracker.afterFlush(function () { analytics.page(router.route.getName()); });
this.next();
});
}