Routing

Symbiote.js has a built-in solution for the SPA routing based on standard History API.

Let's create the simple application example, to see how it works:

import Symbiote, { html, AppRouter } from '@in-wave/symbiote';

// Describe your application routing map:
let routingMap = {
  home: {
    title: 'Homepage',
    default: true,
  },
  section: {
    title: 'Section',
  },
  error: {
    title: 'Error...',
    error: true,
  },
};

// Create the named PubSub instance, connected to the History API:
AppRouter.initRoutingCtx('R', routingMap);

// Use router in your component:
class AppShell extends Symbiote {

  renderCallback() {
    // Subscribe on route change and render the application sections:
    this.sub('R/route', (route) => {
      this.ref.viewport.innerHTML = `<${route}-section></${route}-section>`;
    });
  }

}

// Create the menu:
let menuHtml = Object.keys(routingMap).map((key) => {
  return /*html*/ `<a href="./${key}">${routingMap[key].title}</a>`;
}).join('');

// Use the menu and the routing data in the template:
AppShell.template = html`
  <menu>${menuHtml}</menu>
  <h1>{{R/title}}</h1>
  <div ref="viewport"></div>
`;

AppShell.reg('app-shell');

Static methods

AppRouter.initRoutingCtx()

Syntax:

initRoutingCtx(id, routingMap)

// > PubSub instance
Argument Type ? Description
id String required Context ID
routingMap Object<string, RouteDescriptor> required Routing map

RouteDescriptor type description:

Property Type ? Description
title String optional Page title
default Boolean optional Default route
error Boolean optional Error route

Example:

AppRouter.initRoutingCtx('ROUTER_CTX_NAME', {
  home: {
    title: 'Homepage',
    default: true,
  },
  // ...
  error: {
    title: 'Error...',
    error: true,
  },
});

AppRouter.applyRoute()

Use applyRoute to change application route and apply additional routing data:

Syntax:

applyRoute(routeName, options)
Argument Type ? Description
routeName String required Route name
options Object<string, String | Number | Boolean> optional Additional options

Example:

AppRouter.applyRoute('my_section', {
  first_option: 1,
  second_option: true,
});

This will set your browser address bar to: <APP_URL>?my_section&first_option=1&second_option

AppRouter.setSeparator()

Sometimes, you need to set custom format for the URL-string, for example to avoid options removal by some external URL-parser.

Use setSeparator to set custom symbol for the request parameters separation.

Syntax:

setSeparator(separator)
Argument Type ? Description
separator String required Separator symbol/s

Example:

AppRouter.setSeparator('@');

The default separator symbol is: &

AppRouter.setDefaultTitle()

Use to set the default page title for the cases, when the route title is not set.

Syntax:

setDefaultTitle(title)
Argument Type ? Description
title String required Default page title

Example:

AppRouter.setDefaultTitle('My super app!');

AppRouter.setRoutingMap()

Use to update the routing map and add the new routes.

Syntax:

setRoutingMap(routingMap)
Argument Type ? Description
routingMap Object<string, RouteDescriptor> required Routing map

Example:

AppRouter.setRoutingMap({
  new_route: {
    title: 'New section',
  }
});