# Arquitectura de una aplicación

Ionic, al estar basado en Angular, utiliza el patron conocido como Vista-Controlador (*View-Controller*) que fue popularizado por *frameworks* como *Cocoa Touch*. En este tipo de patrón las diferentes secciones de la intefaz se pueden dividir en distintas vistas hijas o incluso podrían ser vistas hijas que contengan a su vez otras vistas hijas. Los controladores están asociados a estas vistas y se encargan de proporcionar los datos necesarios y la funcionalidad de los diferentes elementos.

En la siguiente imagen se puede ver un esquema de la arquitectura completa que sigue Ionic y Angular:

![](https://4180708432-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LwrBJxsH1hechL6qBM3%2F-LwrBLQQlaazlSYkKJHB%2F-LwrBVw_STW8YJeQNv0d%2Farquitectura_angular.png?generation=1577179054605348\&alt=media)

En la arquitectura de una aplicación intervienen muchos tipos de componentes además de las Vistas y Controladores, iremos viendo cada uno de ellos poco a poco, pero principalmente los que nos interesan son las Vistas, Controladores, Servicios o Factorias, y la Configuración y Rutas.

Intuitivamente, la tarea de cada uno de estos componentes en una aplicación con Ionic es la siguiente:

* Los controladores obtienen los datos de uno o varios Servicios o Factorias y lo envían a una vista o *template* a través de la variable `$scope`.&#x20;
* Las vistas o *templates* contienen la descripción visual de una pantalla (o de una parte de una pantalla) y obtienen los datos a mostrar de la variable `$scope`.&#x20;
* La configuración y las rutas de la aplicación permiten enlazar los controladores con las vistas o *templates* correspondientes.
* Las directivas permiten crear y usar componentes con aspecto y comportamiento personalizado.&#x20;

## Inicializando la aplicación

Como ya hemos visto en secciones anteriores, el punto de inicio de una aplicación Ionic es el fichero `index.html`, el cual como mínimo deberá tener el siguiente contenido:

```markup
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, 
            user-scalable=no, width=device-width">
    <title></title>

    <link href="lib/ionic/css/ionic.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">

    <!-- ionic/angularjs js -->
    <script src="lib/ionic/js/ionic.bundle.js"></script>

    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>

    <!-- your app's js -->
    <script src="js/app.js"></script>
  </head>
  <body ng-app="starter">

    <ion-nav-bar class="bar-positive">
        <ion-nav-back-button class="button-clear">
            <i class="ion-chevron-left padding-left"></i>
        </ion-nav-back-button>
    </ion-nav-bar>
    <ion-nav-view></ion-nav-view>

  </body>
</html>
```

En este código en primer lugar en la cabecera se cargan las dependencias de la aplicación: hojas de estilo, librería JavaScript de Ionic (la cual incorpora Angular), librería de Cordova y los ficheros JavaScript de nuestra aplicación (`js/app.js`).

A continuación en el `body` se indica el módulo de Angular a utilizar con `ng-app="starter"`. Esta línea inicia la carga del módulo llamado `starter` que estará definido en el fichero `js/app.js` de la forma:

```javascript
angular.module('starter', ['ionic'])
```

Esta es la forma de crear un módulo con Angular, como primer parámetro indicamos el nombre del módulo (`starter`) y a continuación las dependecias, que en este caso solo se carga la librería de `ionic`. A continuación podremos indicar la configuración, los controladores y servicios que componen el módulo de la forma:

```javascript
angular.module('starter', ['ionic'])

.config( /* ... */ )

.controller( /* ... */ )

.factory( /* ... */ )
```

En las siguientes secciones veremos cada uno de estos apartados por separado y por último se incluye un ejemplo completo.
