AngularJS


Routing using ngRoute All Versions

0.9.0
0.9.1
0.9.2
0.9.3
0.9.4
0.9.5
0.9.6
0.9.7
0.9.9
0.9.10
0.9.11
0.9.12
0.9.13
0.9.14
0.9.15
0.9.16
0.9.17
0.9.18
0.9.19
0.10.0
0.10.1
0.10.2
0.10.3
0.10.4
0.10.5
0.10.6
1.0.0rc1
g3-v1.0.0rc1
g3-v1.0.0-rc2
v1.0.0rc2
v1.0.0rc3
v1.0.0rc4
v1.0.0rc5
v1.0.0rc6
v1.0.0rc7
v1.0.0rc8
v1.0.0rc9
v1.0.0rc10
v1.0.0rc11
v1.0.0rc12
1.0.0
1.0.1
1.0.2
1.1.0
1.0.3
1.1.1
1.0.4
1.1.2
1.0.5
1.1.3
1.0.6
1.1.4
1.0.7
1.1.5
1.2.0rc1
1.0.8
1.2.0-rc.2
1.2.0-rc.3
1.2.0
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6
1.2.7
1.2.8
1.2.9
1.2.10
1.2.11
1.2.12
1.2.13
1.2.14
1.3.0-beta.1
1.3.0-beta.2
1.3.0-beta.3
1.2.15
1.3.0-beta.4
1.2.16
1.3.0-beta.5
1.3.0-beta.6
1.3.0-beta.7
1.3.0-beta.8
1.3.0-beta.9
1.3.0-beta.10
1.2.17
1.3.0-beta.11
1.2.18
1.3.0-beta.12
1.3.0-beta.13
1.2.19
1.3.0-beta.14
1.2.20
1.3.0-beta.15
1.3.0-beta.16
1.2.21
1.3.0-beta.17
1.2.22
1.3.0-beta.18
1.2.23
1.3.0-beta.19
1.3.0-rc.0
1.2.24
1.3.0-rc.1
1.2.25
1.3.0-rc.2
1.3.0-rc.3
1.3.0-rc.4
1.2.26
1.3.0-rc.5
1.3.0
1.3.1
1.3.2
1.3.3
1.2.27
1.3.4
1.3.5
1.3.6
1.3.7
1.2.28
1.3.8
1.4.0-beta.0
1.3.9
1.3.10
1.4.0-beta.1
1.3.11
1.4.0-beta.2
1.3.12
1.4.0-beta.3
1.3.13
1.4.0-beta.4
1.3.14
1.4.0-beta.5
1.3.15
1.4.0-beta.6
1.4.0-rc.0
1.4.0-rc.1
1.4.0-rc.2
1.4.0
1.3.16
1.4.1
1.3.17
1.4.2
1.4.3
1.4.4
1.3.18
1.4.5
1.3.19
1.4.6
1.5.0-beta.0
1.2.29
1.3.20
1.4.7
1.5.0-beta.1
1.5.0-beta.2
1.4.8
1.5.0-rc.0
1.5.0-rc.1
1.4.9
1.5.0-rc.2
1.5.0
1.4.10
1.5.1
1.5.2
1.5.3
1.5.4
1.5.5
1.4.11
1.5.6
1.4.12
1.5.7
1.2.30
1.5.8

This draft deletes the entire topic.

expand all collapse all

Examples

  • 3

    This example shows setting up a small application with 3 routes, each with it's own view and controller, using the controllerAs syntax.

    We configure our router at the angular .config function

    1. We inject $routeProvider into .config
    2. We define our route names at the .when method with a route definition object.
    3. We supply the .when method with an object specifying our template or templateUrl, controller and controllerAs

    app.js

    angular.module('myApp', ['ngRoute'])
      .controller('controllerOne', function() {
        this.message = 'Hello world from Controller One!';
      })
      .controller('controllerTwo', function() {
        this.message = 'Hello world from Controller Two!';
      })
      .controller('controllerThree', function() {
        this.message = 'Hello world from Controller Three!';
      })
      .config(function($routeProvider) {
        $routeProvider
        .when('/one', {
          templateUrl: 'view-one.html',
          controller: 'controllerOne',
          controllerAs: 'ctrlOne'
        })
        .when('/two', {
          templateUrl: 'view-two.html',
          controller: 'controllerTwo',
          controllerAs: 'ctrlTwo'
        })
        .when('/three', {
          templateUrl: 'view-three.html',
          controller: 'controllerThree',
          controllerAs: 'ctrlThree'
        })
        // redirect to here if no other routes match
        .otherwise({
          redirectTo: '/one'
        });
      });
    

    Then in our HTML we define our navigation using <a> elements with href, for a route name of helloRoute we will route as <a href="#/helloRoute">My route</a>

    We also provide our view with a container and the directive ng-view to inject our routes.

    index.html

    <div ng-app="myApp">
      <nav>
        <!-- links to switch routes -->
        <a href="#/one">View One</a>
        <a href="#/two">View Two</a>
        <a href="#/three">View Three</a>
      </nav>
      <!-- views will be injected here -->
      <div ng-view></div>
      <!-- templates can live in normal html files -->
      <script type="text/ng-template" id="view-one.html">
        <h1>{{ctrlOne.message}}</h1>
      </script>
    
      <script type="text/ng-template" id="view-two.html">
        <h1>{{ctrlTwo.message}}</h1>
      </script>
    
      <script type="text/ng-template" id="view-three.html">
        <h1>{{ctrlThree.message}}</h1>
      </script>
    </div>
    
  • 2

    The simplest manner of defining custom behavior for individual routes would be fairly easy.

    In this example we use it to authenticate a user :

    1) routes.js: create a new property (like requireAuth) for any desired route

    angular.module('yourApp').config(['$routeProvider', function($routeProvider) {
        $routeProvider
            .when('/home', {
                templateUrl: 'templates/home.html',
                requireAuth: true
            })
            .when('/login', {
                templateUrl: 'templates/login.html',
            })
            .otherwise({
                redirectTo: '/home'
            });
    }])
    

    2) In a top-tier controller that isn't bound to an element inside the ng-view (to avoid conflict with angular $routeProvider), check if the newUrl has the requireAuth property and act accordingly

    angular.module('YourApp').controller('YourController', ['$scope', 'session', '$location',
        function($scope, session, $location) {
    
            $scope.$on('$routeChangeStart', function(angularEvent, newUrl) {
                
                if (newUrl.requireAuth && !session.user) {
                    // User isn’t authenticated
                    $location.path("/login");
                }
                
            });
        }
    ]);
    
  • 1

    This example extends the basic example passing parameters in the route in order to use them in the controller

    To do so we need to:

    1. Configure the parameter position and name in the route name
    2. Inject $routeParams service in our Controller

    app.js

    angular.module('myApp', ['ngRoute'])
      .controller('controllerOne', function() {
        this.message = 'Hello world from Controller One!';
      })
      .controller('controllerTwo', function() {
        this.message = 'Hello world from Controller Two!';
      })
      .controller('controllerThree', ['$routeParams', function($routeParams) {
        var routeParam = $routeParams.paramName
    
        if ($routeParams.message) {
            // If a param called 'message' exists, we show it's value as the message
            this.message = $routeParams.message;
        } else {
            // If it doesn't exist, we show a default message
            this.message = 'Hello world from Controller Three!';
        }
      }])
      .config(function($routeProvider) {
        $routeProvider
        .when('/one', {
          templateUrl: 'view-one.html',
          controller: 'controllerOne',
          controllerAs: 'ctrlOne'
        })
        .when('/two', {
          templateUrl: 'view-two.html',
          controller: 'controllerTwo',
          controllerAs: 'ctrlTwo'
        })
        .when('/three', {
          templateUrl: 'view-three.html',
          controller: 'controllerThree',
          controllerAs: 'ctrlThree'
        })
        .when('/three/:message', { // We will pass a param called 'message' with this route
          templateUrl: 'view-three.html',
          controller: 'controllerThree',
          controllerAs: 'ctrlThree'
        })
        // redirect to here if no other routes match
        .otherwise({
          redirectTo: '/one'
        });
      });
    

    Then, withoud making any changes in our templates, only adding a new link with custom message, we can see the new custom message in our view.

    index.html

    <div ng-app="myApp">
      <nav>
        <!-- links to switch routes -->
        <a href="#/one">View One</a>
        <a href="#/two">View Two</a>
        <a href="#/three">View Three</a>
        <!-- New link with custom message -->
        <a href="#/three/This-is-a-message">View Three with "This-is-a-message" custom message</a>
      </nav>
      <!-- views will be injected here -->
      <div ng-view></div>
      <!-- templates can live in normal html files -->
      <script type="text/ng-template" id="view-one.html">
        <h1>{{ctrlOne.message}}</h1>
      </script>
    
      <script type="text/ng-template" id="view-two.html">
        <h1>{{ctrlTwo.message}}</h1>
      </script>
    
      <script type="text/ng-template" id="view-three.html">
        <h1>{{ctrlThree.message}}</h1>
      </script>
    </div>
    

I am downvoting this example because it is...

Syntax

Syntax

Parameters

Parameters

Remarks

The ngRoute is a build-in module provides routing and deeplinking services and directives for angular apps.

Full documentation about ngRoute is avalable on https://docs.angularjs.org/api/ngRoute

Still have a question about Routing using ngRoute? Ask Question

Basic example

3

This example shows setting up a small application with 3 routes, each with it's own view and controller, using the controllerAs syntax.

We configure our router at the angular .config function

  1. We inject $routeProvider into .config
  2. We define our route names at the .when method with a route definition object.
  3. We supply the .when method with an object specifying our template or templateUrl, controller and controllerAs

app.js

angular.module('myApp', ['ngRoute'])
  .controller('controllerOne', function() {
    this.message = 'Hello world from Controller One!';
  })
  .controller('controllerTwo', function() {
    this.message = 'Hello world from Controller Two!';
  })
  .controller('controllerThree', function() {
    this.message = 'Hello world from Controller Three!';
  })
  .config(function($routeProvider) {
    $routeProvider
    .when('/one', {
      templateUrl: 'view-one.html',
      controller: 'controllerOne',
      controllerAs: 'ctrlOne'
    })
    .when('/two', {
      templateUrl: 'view-two.html',
      controller: 'controllerTwo',
      controllerAs: 'ctrlTwo'
    })
    .when('/three', {
      templateUrl: 'view-three.html',
      controller: 'controllerThree',
      controllerAs: 'ctrlThree'
    })
    // redirect to here if no other routes match
    .otherwise({
      redirectTo: '/one'
    });
  });

Then in our HTML we define our navigation using <a> elements with href, for a route name of helloRoute we will route as <a href="#/helloRoute">My route</a>

We also provide our view with a container and the directive ng-view to inject our routes.

index.html

<div ng-app="myApp">
  <nav>
    <!-- links to switch routes -->
    <a href="#/one">View One</a>
    <a href="#/two">View Two</a>
    <a href="#/three">View Three</a>
  </nav>
  <!-- views will be injected here -->
  <div ng-view></div>
  <!-- templates can live in normal html files -->
  <script type="text/ng-template" id="view-one.html">
    <h1>{{ctrlOne.message}}</h1>
  </script>

  <script type="text/ng-template" id="view-two.html">
    <h1>{{ctrlTwo.message}}</h1>
  </script>

  <script type="text/ng-template" id="view-three.html">
    <h1>{{ctrlThree.message}}</h1>
  </script>
</div>

Defining custom behavior for individual routes

2

The simplest manner of defining custom behavior for individual routes would be fairly easy.

In this example we use it to authenticate a user :

1) routes.js: create a new property (like requireAuth) for any desired route

angular.module('yourApp').config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/home', {
            templateUrl: 'templates/home.html',
            requireAuth: true
        })
        .when('/login', {
            templateUrl: 'templates/login.html',
        })
        .otherwise({
            redirectTo: '/home'
        });
}])

2) In a top-tier controller that isn't bound to an element inside the ng-view (to avoid conflict with angular $routeProvider), check if the newUrl has the requireAuth property and act accordingly

angular.module('YourApp').controller('YourController', ['$scope', 'session', '$location',
    function($scope, session, $location) {

        $scope.$on('$routeChangeStart', function(angularEvent, newUrl) {
            
            if (newUrl.requireAuth && !session.user) {
                // User isn’t authenticated
                $location.path("/login");
            }
            
        });
    }
]);

Route parameters example

1

This example extends the basic example passing parameters in the route in order to use them in the controller

To do so we need to:

  1. Configure the parameter position and name in the route name
  2. Inject $routeParams service in our Controller

app.js

angular.module('myApp', ['ngRoute'])
  .controller('controllerOne', function() {
    this.message = 'Hello world from Controller One!';
  })
  .controller('controllerTwo', function() {
    this.message = 'Hello world from Controller Two!';
  })
  .controller('controllerThree', ['$routeParams', function($routeParams) {
    var routeParam = $routeParams.paramName

    if ($routeParams.message) {
        // If a param called 'message' exists, we show it's value as the message
        this.message = $routeParams.message;
    } else {
        // If it doesn't exist, we show a default message
        this.message = 'Hello world from Controller Three!';
    }
  }])
  .config(function($routeProvider) {
    $routeProvider
    .when('/one', {
      templateUrl: 'view-one.html',
      controller: 'controllerOne',
      controllerAs: 'ctrlOne'
    })
    .when('/two', {
      templateUrl: 'view-two.html',
      controller: 'controllerTwo',
      controllerAs: 'ctrlTwo'
    })
    .when('/three', {
      templateUrl: 'view-three.html',
      controller: 'controllerThree',
      controllerAs: 'ctrlThree'
    })
    .when('/three/:message', { // We will pass a param called 'message' with this route
      templateUrl: 'view-three.html',
      controller: 'controllerThree',
      controllerAs: 'ctrlThree'
    })
    // redirect to here if no other routes match
    .otherwise({
      redirectTo: '/one'
    });
  });

Then, withoud making any changes in our templates, only adding a new link with custom message, we can see the new custom message in our view.

index.html

<div ng-app="myApp">
  <nav>
    <!-- links to switch routes -->
    <a href="#/one">View One</a>
    <a href="#/two">View Two</a>
    <a href="#/three">View Three</a>
    <!-- New link with custom message -->
    <a href="#/three/This-is-a-message">View Three with "This-is-a-message" custom message</a>
  </nav>
  <!-- views will be injected here -->
  <div ng-view></div>
  <!-- templates can live in normal html files -->
  <script type="text/ng-template" id="view-one.html">
    <h1>{{ctrlOne.message}}</h1>
  </script>

  <script type="text/ng-template" id="view-two.html">
    <h1>{{ctrlTwo.message}}</h1>
  </script>

  <script type="text/ng-template" id="view-three.html">
    <h1>{{ctrlThree.message}}</h1>
  </script>
</div>

Topic Outline