AngularJS Routing

Tien

  • Drupal developer
  • Since 2013

Outline

  • What is routing in AngularJS
  • ng-route
  • ui-router
  • Why refer ui-router than ng-route
  • SEO?

What?

There are 2 kinds

  • ng-route
  • ui-router

ng-route

var sampleApp = angular.module('phonecatApp', ['ngRoute']);
  
sampleApp .config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/addOrder', {
        templateUrl: 'templates/add-order.html',
        controller: 'AddOrderController'
      }).
      when('/showOrders', {
        templateUrl: 'templates/show-orders.html',
        controller: 'ShowOrdersController'
      }).
      otherwise({
        redirectTo: '/addOrder'
      });
  }]);

ng-route

<div class="container">
    <div class="row">
    <div class="col-md-3">
        <ul class="nav">
            <li><a href="#AddNewOrder"> Add New Order </a></li>
            <li><a href="#ShowOrders"> Show Order </a></li>
        </ul>
    </div>
    <div class="col-md-9">
        <div ng-view=""></div>
    </div>
    </div>
</div>

router's parameters

when('/ShowOrder/:orderId', {
      templateUrl: 'templates/show_order.html',
      controller: 'ShowOrderController'
});

router's parameters

sampleApp.controller('ShowOrderController', function($scope, $routeParams) {
 
    $scope.order_id = $routeParams.orderId;
 
});

router's custom data

when('/AddNewOrder', {
    templateUrl: 'templates/add_order.html',
    controller: 'CommonController',
    foodata: 'addorder'
}).

router's custom data

sampleApp.controller('CommonController', function($scope, $route) {
    //access the foodata property using $route.current
    var foo = $route.current.foodata;
     
    alert(foo);
     
});

ui-router

var myApp = angular.module('clockApp', ['ui.router']);

myApp.config(function($stateProvider, $urlRouterProvider) {
  $stateProvider
    .state('home', {
      url: "/home",
      templateUrl: "partials/home.html",
      views: {
        "sidebar": {
            template: "partial.sidebar",
            controller: "SidebarCtrl"
        },
        "navbar": {
            template: "partial.navbar",
            controller: "NavbarCtrl"
        },
      }
      controller: function($scope) {
        // Prepare values for the main content.
      }
    })
});

ui-router

<!-- home.html -->
<body>
    <ul class="nav navbar-nav navbar-right">
        <li ui-sref-active="active"><a ui-sref="clock">Clock</a></li>
        <li ui-sref-active="active"><a ui-sref="world-clock">World Clock</a></li>
        <li ui-sref-active="active"><a ui-sref="alarm-clock">Alarm Clock</a></li>
        <li ui-sref-active="active"><a ui-sref="countdown-timer">Countdown Timer</a></li>
    </ul>

    <div class="container" ui-view="main"></div>
</body>

Create sub state

$stateProvider.state('clock', {
    url: '/clock',
    views: {
        main: {
            templateUrl: 'views/clock.html',
            controller: 'ClockCtrl'
        }
    }
});
$stateProvider.state('clock.type', {
    url: '/:type',
    views: {
        'sub': {
            templateUrl: function ($stateParams) {
                return '/views/clock/' + $stateParams.type + '.html';
            }
        }
    }
});

How to go to a state

<a href="#/clock/analog">Analog Clock</a>

<a ui-sref="clock.type({type:'analog'})">Analog Clock</a>

$state.go('clock.type', {type: 'analog'});

Default parameter value

$urlRouterProvider.when("/clock", "/clock/digital");

ng-route

  • Single view
  • Base on url
  • href

ui-router

  • Multiple/nested views
  • Base on router name
  • ui-sref and ui-sref-active
  • Switch between states, pass information between states

SEO

<div class="container" ui-view="main"></div>

SEO

http://yourwebsite.com/#!/some/page/

SEO

http://yourwebsite.com/?_escaped_fragment_=/some/page/with/ajax/content 

Testing

  • Define karma config
  • Define grunt task
  • Write feature
  • Integrate with CI

Testing

'use strict';

describe("E2E: Testing Routes", function () {

    beforeEach(function () {
        browser().navigateTo('/');
    });

    it('should jump to the /clock/digital path when / is accessed', function () {
        browser().navigateTo('#/');
        expect(browser().location().path()).toBe("/clock/digital");
    });

    it('should have a working /alarm-clock route', function () {
        browser().navigateTo('#/alarm-clock');
        expect(browser().location().path()).toBe("/alarm-clock");
    });

    it('should have a working /world-clock route', function () {
        browser().navigateTo('#/world-clock');
        expect(browser().location().path()).toBe("/world-clock");
    });

    it('should jump to the /clock/digital path when /invalid-url is accessed', function () {
        browser().navigateTo('#/invalid-url');
        expect(browser().location().path()).toBe("/clock/digital");
    });

});

References

angularjs-routing

By Tiến Võ Xuân

angularjs-routing

  • 1,094