@ngdoc tutorial @name 9 - Routing & Multiple Views @step 9 @description In this step, you will learn how to create a layout template and how to build an application that has multiple views by adding routing, using an AngularJS module called {@link ngRoute ngRoute}. * When you now navigate to `/index.html`, you are redirected to `/index.html#!/phones` and the phone list appears in the browser. * When you click on a phone link, the URL changes to that specific phone and the stub of a phone detail page is displayed.
## Dependencies The routing functionality added in this step is provided by AngularJS in the `ngRoute` module, which is distributed separately from the core AngularJS framework. Since we are using [npm][npm] to install client-side dependencies, this step updates the `package.json` configuration file to include the new dependency:
**`package.json`:** ```json { "name": "angular-phonecat", ... "dependencies": { "angular": "1.8.x", "angular-route": "1.8.x", "bootstrap": "3.3.x" }, ... } ``` The new dependency `"angular-route": "1.8.x"` tells npm to install a version of the angular-route module that is compatible with version 1.8.x of AngularJS. We must tell npm to download and install this dependency. ``` npm install ``` ## Multiple Views, Routing and Layout Templates Our app is slowly growing and becoming more complex. Prior to this step, the app provided our users with a single view (including the list of all phones), and all of the template code was located in the `phone-list.template.html` file. The next step in building the application is to add a view that will show detailed information about each of the devices in our list. To add the detailed view, we are going to turn `index.html` into what we call a "layout template". This is a template that is common for all views in our application. Other "partial templates" are then included into this layout template depending on the current "route" — the view that is currently displayed to the user. Application routes in AngularJS are declared via the {@link ngRoute.$routeProvider $routeProvider}, which is the provider of the {@link ngRoute.$route $route} service. This service makes it easy to wire together controllers, view templates, and the current URL location in the browser. Using this feature, we can implement [deep linking][deep-linking], which lets us utilize the browser's history (back and forward navigation) and bookmarks.

`ngRoute` lets us associate a controller and a template with a specific URL (or URL pattern). This is pretty close to what we did with `ngController` and `index.html` back in {@link step_02 step 2}.

Since we have already learned that components allow us to combine controllers with templates in a modular, testable way, we are going to use components for routing as well. Each route will be associated with a component and that component will be in charge of providing the view template and the controller.

### A Note about DI, Injector and Providers As you {@link step_07 noticed}, {@link guide/di dependency injection} (DI) is at the core of AngularJS, so it's important for you to understand a thing or two about how it works. When the application bootstraps, AngularJS creates an injector that will be used to find and inject all of the services that are required by your application. The injector itself doesn't know anything about what the `$http` or `$route` services do. In fact, the injector doesn't even know about the existence of these services, unless it is configured with proper module definitions. The injector only carries out the following steps: * Load the module definition(s) that you specify in your application. * Register all Providers defined in these module definition(s). * When asked to do so, lazily instantiate services and their dependencies, via their Providers, as parameters to an injectable function. Providers are objects that provide (create) instances of services and expose configuration APIs, that can be used to control the creation and runtime behavior of a service. In case of the `$route` service, the `$routeProvider` exposes APIs that allow you to define routes for your application.
**Note:** Providers can only be injected into `config` functions. Thus you could not inject `$routeProvider` into `PhoneListController` at runtime.
AngularJS modules solve the problem of removing global variables from the application and provide a way of configuring the injector. As opposed to AMD or require.js modules, AngularJS modules don't try to solve the problem of script load ordering or lazy script fetching. These goals are totally independent and both module systems can live side-by-side and fulfill their goals. To deepen your understanding on AngularJS's DI, see [Understanding Dependency Injection][wiki-di]. ## Template The `$route` service is usually used in conjunction with the {@link ngRoute.directive:ngView ngView} directive. The role of the `ngView` directive is to include the view template for the current route into the layout template. This makes it a perfect fit for our `index.html` template.
**`app/index.html`:** ```html ... ...
``` We have added four new `