GithubHelp home page GithubHelp logo

meteor-router's Introduction

Meteor Router

Meteor Router builds on page.js to provide reactive, filterable routing for Meteor applications.

Installation

Meteor Router can be installed with Meteorite. From inside a Meteorite-managed app:

$ mrt add router

Note that Router version 0.4.3 works with Meteor 0.5.8 and later, and 0.4.2 works with Meteor 0.5.7 and earlier.

API

Basics

To get the current page:

Meteor.Router.page();

This is a reactive variable which will trigger invalidations as the app changes pages. Usually, you'll just want to render the template that corresponds to the current page using the following helper that finds the template by name:

{{renderPage}}

To define a route, simply specify the URL it matches and the name of the template it should render. If you want to get fancy, you can specify a reactive function that returns a template name. It will get repeatedly executed as its reactive dependencies change.

Be careful not to specify your routes inside the Meteor.startup function, or the routing won't work for the first load.

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

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

  '*': 'not_found'
});

To navigate to such a URL from in the app, either create a link which links to the URL (the router will intercept clicks and trigger relevant state changes), or call directly:

Meteor.Router.to('/news');

Note that this doesn't reload the app, it instead uses HTML5 pushState to change the URL whilst remaining loaded.

Route functions

When the route function is called, this corresponds to a page.js Context object, allowing you to do the following:

Meteor.Router.add({
  'posts/:id': function(id) {
    console.log('we are at ' + this.canonicalPath);
    console.log("our parameters: " + this.params);

    // access parameters in order a function args too
    Session.set('currentPostId', id);
    return 'showPost';
  }
});

Filtering

The current system of filtering in this package is the equivalent of an after_filter in Rails. To add a filter which will render the correct template for a page which requires login:

Meteor.Router.filters({
  'checkLoggedIn': function(page) {
    if (Meteor.loggingIn()) {
      return 'loading';
    } else if (Meteor.user()) {
      return page;
    } else {
      return 'signin';
    }
  }
});

To turn the filter on, use one of:

// applies to all pages
Meteor.Router.filter('checkLoggedIn');

// applies to specific pages
Meteor.Router.filter('checkLoggedIn', {only: 'profile'});
Meteor.Router.filter('checkLoggedIn', {except: 'home'});

// accepts an array of pages
Meteor.Router.filter('checkLoggedIn', {only: ['profile', 'notifications'] });
Meteor.Router.filter('checkLoggedIn', {except: ['home', 'browse'] });

Note that filters build on reactivity. So the URL will not change but the user will see different pages as the state of the Meteor.user() property changes.

Server-side routing

The router also allows a very simple server side routing function with a similar API:

Meteor.Router.add('/posts/:id.xml', function(id) {
  return constructXMLForId(Posts.findOne(id));
});

Optionally you can also restrict the route by HTTP method:

Meteor.Router.add('/posts/:id.xml', 'GET', function(id) {
  return constructXMLForId(Posts.findOne(id));
});
Meteor.Router.add('/posts/:id.xml', 'DELETE', function(id) {
  Posts.remove(id);
  return [204, 'No Content'];
});

The arguments to the routing function are the parameters you've specified in your URL, and the this within the function is an object with three properties:

  • this.params -- the list of parameters, page.js style
  • this.request -- a Connect request
  • this.response -- a Connect response (use this to e.g. set headers on your response).

Your routing function can return one of the following:

  • a string, the body of the response
  • a number, the http status code
  • an array, in one of the following forms:
    • [body]
    • [statusCode, body]
    • [statusCode, headers, body], where headers is an object mapping header names to values.

Alternatively, rather than a routing function, you can just provide a fixed response:

Meteor.Router.add('/404', [404, "There's nothing here!"]);

NOTE: Spark (meteor's template engine) does not currently run server side, so you are limited in what you can return here. Most likely you will want to return fairly simple things like JSON or XML documents, the construction of which is up to you.

Examples

Check out examples/simple-routed-app for an extremely simple example of a filtered routed app. (To run, use meteorite: cd examples/simple-routed-app; mrt run).

Additionally, you might want to read my blog post on page transitions in Meteor.

Internet explorer 8+ support

If you want the router to work in older version of Internet Explorer that don't support pushState, you can use the HTML5-History-API polyfill:

  mrt add HTML5-History-API

NOTE: Either do this before adding the router, or edit your app's .meteor/packages file to make sure it's listed before the router. This is a limitation that I'm working on.

Contributing

To run the tests, ensure that the router is checked out to a folder called router, and then simply run:

$ mrt

meteor-router's People

Contributors

tmeasday avatar bashofmann avatar dandv avatar egtann avatar igoodrich avatar mcinglis avatar herrbeesch avatar williamledoux avatar

Watchers

 avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.