55 votes

Comment créer des applications multi-pages avec Meteor ?

Je suis novice en Javascript et j'ai commencé à jouer avec Meteor par curiosité. Ce qui me surprend vraiment, c'est qu'il semble que tout le contenu HTML soit combiné en une seule page.

Je soupçonne qu'il existe un moyen d'introduire une certaine gestion des URL qui dirigent vers des pages spéciales. Il semble que l'exemple "todo" soit capable de faire cela via une sorte de Router la classe. Est-ce la façon "canonique" de gérer les URL ?

En supposant que je puisse gérer les URL, comment structurer mon code HTML pour afficher des pages séparées ? Dans mon cas, elles pourraient chacune contenir des ensembles de données complètement distincts, de sorte qu'aucun code HTML ne doit être partagé.

30voto

user456584 Points 8772

La réponse de Jon Gold était correcte, mais à partir de Meteor 0.5.4 :

Le travail s'est maintenant déplacé vers Iron Router. Veuillez envisager d'utiliser IR au lieu de Routeur sur les nouveaux projets !

Ainsi, la manière "canonique" actuelle de procéder est probablement d'utiliser IronRouter .

29voto

nsmeta Points 1253

Pour autant que je sache, il n'existe pas actuellement de méthode prête à l'emploi pour ce faire.

Ce que je suggère de faire, c'est d'utiliser le paquet intelligent de Backbone.js. Backbone.js est livré avec le routeur push-state, et si le navigateur de l'utilisateur ne le supporte pas, il se rabattra sur des urls de hachage.

Dans le répertoire de votre application meteor, tapez ceci meteor add backbone .

Puis, quelque part dans votre code côté client, créez un routeur Backbone.js comme suit :

var Router = Backbone.Router.extend({
  routes: {
    "":                 "main", //this will be http://your_domain/
    "help":             "help"  // http://your_domain/help
  },

  main: function() {
    // Your homepage code
    // for example: Session.set('currentPage', 'homePage');
  },

  help: function() {
    // Help page
  }
});
var app = new Router;
Meteor.startup(function () {
  Backbone.history.start({pushState: true});
});

Ensuite, quelque part dans votre modèle Handlebars, vous pouvez créer une aide qui rendra une page en fonction de la valeur définie dans "currentPage" de la session.

Vous pouvez trouver plus d'informations sur le routeur backbone.js ici : http://backbonejs.org/#Router

Vous trouverez également des informations pertinentes sur la façon de créer une méthode d'aide Handlebars dans Metoer ici : http://docs.meteor.com/#templates

J'espère que cela vous aidera.

26voto

Jon Gold Points 379

Meteor-Router rend cela très facile. Je l'ai utilisé dans certaines applications que j'ai construites avec Telescope comme bonne référence. Jetez un coup d'oeil au site de Telescope router.js

Pour l'utiliser

mrt add router

Dans client/router.js :

Meteor.Router.add({
  '/news': 'news', // renders template 'news'

  '/about': function() {
    if (Session.get('aboutUs')) {
      return 'aboutUs'; //renders template 'aboutUs'
    } else {
      return 'aboutThem'; //renders template 'aboutThem'
    }
  },

  '*': 'not_found'
});

Dans votre modèle

<body>{{renderPage}}</body>

10voto

Carlos Barcelona Points 713

J'ai trouvé le même problème. Quand le code devient plus gros, il est difficile de garder le code propre.

Voici mon approche de ce problème :

Je sépare les différentes pages html comme je le ferais avec un autre framework web. Il existe un index.html où je stocke la page html racine. Ensuite, pour chaque grande partie fonctionnelle, je crée un modèle différent et le place dans une page html différente. Meteor les fusionne ensuite tous. Enfin, je crée une variable de session appelée operation où je définis ce qu'il faut montrer à chaque moment.

Voici un exemple simple

index.html

<head>
  <title>My app name</title>
</head>

<body>
 {{> splash}}
 {{> user}}
 {{> debates}}
</body>

alors dans splash.html

<template name="splash">
    {{#if showSplash}}
      ... your splash html code goes here...
    {{/if}}
</template>

alors dans utilisateur.html

<template name="user">
    {{#if showUser}}
      ... your user html code goes here...
    {{/if}}
</template>

et ainsi de suite ...

Dans le code javascript, je vérifie ensuite quand imprimer chaque modèle en utilisant la variable Session, comme ceci :

Template.splash.showSplash = function(){
    return Session.get("operation") == 'showSplash';
}

Enfin, le routeur dorsal gère cette variable de session.

var DebateRouter = Backbone.Router.extend({

  routes: {
    "": "showSplash",
    "user/:userId": "showUser",
    "showDebates": "showDebates",
    // ...
  },
  splash: function () {
   Session.set('operation', 'showSplash');
   this.navigate('/');
  },
  user: function (userId) {
   Session.set('operation', 'showUser');
   this.navigate('user/'+userId);
  },
  // etc...
});

J'espère que ce modèle sera utile aux autres développeurs Meteor.

7voto

Lander Van Breda Points 660

C'est la solution que j'ai trouvée pour le routage : https://gist.github.com/3221138

Mettez juste le nom de la page comme nom de modèle et naviguez vers /{name}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X