miércoles, 23 de marzo de 2016

Angular 2 + bootstrap

En este articulo vamos a ver como configurar la plantilla de bootsrap con angular 2.
Por que hemos elegido bootstrap, pues por que es la que conozco, es con la que están los ejemplos de angular 2 (a dia de hoy), pero seguramente en un futuro estará el modulo de angular 2 con material, pero de momento lo vamos a integrar con bootstrap
Este ejemplo, se puede encontrar en la siguiente enlace.  

Instalar en nuestro proyecto bootstrap.

Lo primero que vamos a hacer es instalar en nodejs, bootstrap
npm install bootstrap --save
 Este comando nos va a descargar en el directorio node_module\bootsrap los ficheros.

Configurar bootsrap en index

Ahora lo que vamos hacer es asociar en el fichero de index.html, la css de bootsrap.

<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
 Así quedaría nuestro fichero index.hml:

<html>
  <head>
      <title> Angular 2 (Hola mundo)</title>

      <!-- 1. Cargamos las librerias -->
      <script src="node_modules/es6-shim/es6-shim.js"></script>
      <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
      <script src="node_modules/systemjs/dist/system.src.js"></script>
      <script src="node_modules/rxjs/bundles/Rx.js"></script>
      <script src="node_modules/angular2/bundles/angular2.dev.js"></script>
      <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">

      <!-- 2. Configirar SystemJS -->
      <script>
        System.config({
          packages: {
                  'app': {defaultExtension: 'js' }
                }
          });
        System.import('app/boot')
              .then(null, console.error.bind(console));
      </script>
  </head>
  <body>
      <my-app> Cargando ...</my-app>
  </body>
</html>

El siguiente paso va a ser configurar nuestro esqueleto del articulo anterior, con una maquetación estándar de bootsrap.

Cabecera:

Aquí vamos a ver el titulo del proyecto, y un pequeño menú (en este ejemplo no va a funcionar, ya lo veremos en un articulo sobre el router de angular 2).


<nav class="navbar navbar-default navbar-fixed-top">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Ejemplo angular 2</a>
    </div>
    <div id="navbar" class="collapse navbar-collapse">
        <ul class="nav navbar-nav">
           <li class="active"><a href="#about">About</a></li>
           <li><a href="#contact">Contact</a></li>
        </ul>
    </div>
  </div>
</nav>


Se vera así la maquetación

Cuerpo

Aquí es donde vamos a pintar un ejemplo de pantalla.

<div class="page-header">
  <h1>About</h1>
</div>
<p class="lead">Este proyecto es un esqueleto configurado en bootstrap (Cabecera,Cuerpo,Pie).</p>

Se vera así la maquetación

Nota: Para esta maquetación hemos creado una css, y en el componente del app.componet pondremos un div que recubrira para que funciona, mirar los fuentes en github.

Pie

Aquí es donde vamos a poner la información referente al pie.

<footer class="footer">
  <div class="container">
    <p class="text-muted">Es un ejemplo de angular 2 David, Blanco París</p>
  </div>
</footer>
Se vera así la maquetación


Ya tenemos  nuestro proyecto integrado con bootstrap. 

Este ejemplo se basa en el esqueleto que se ha cree en el articulo de crear un esqueleto para nuestra aplicación. (También podéis ver la evolución en los commit del control de versiones). 


lunes, 8 de febrero de 2016

Angular 2, esqueleto de la aplicación

En el articulo anterior vimos, como crear un hola mundo, en este articulo vamos a ver como hacer el esqueleto de nuestra aplicación, vamos a dividir la pantalla en los siguientes apartados:

  • Cabecera: Sera donde se encontrara la cabecera de nuestra aplicación.
  • Cuerpo: Es donde vamos a establecer las pantallas, de nuestra aplicación.
  • Pie: Es donde pondremos la información de nuestra aplicación.
En el siguiente enlace  se puede encontrar este articulo.

Crear una plantilla par el componente de aplicación

Ahora los que vamos a ver es como separar el controlador de la vista, para lo cual simplemente en la configuración del decorador del componente, cambiaremos el atributo de template, por el de templateUrl en el que le vamos a indicar donde se va a encontrar el archivo donde se va a encontrar el fichero con la nueva plantilla ('/app/app.component.html'). A partir de ahora sera la forma de indicar donde se encuentra la plantilla que representa la región de vista que controlara nuestro controlador.

app.component.html
<p>Nueva pagina de hola mundo.</p>
Cambiamos el testo que tiene la plantilla y creamos el nuevo fichero de la vista para que nos salude.

 app.component.ts
import {Component} from 'angular2/core';
@Component({
  selector:'my-app',
  templateUrl:'/app/app.component.html'
})
export class AppComponent{};

Ahora que por un lado hemos visto como se puede separar en angular la vista y el controlador en dos ficheros independientes, vamos a crear un componente nuevo por las 3 nuevas regiones que vamos a establecer.

La norma que voy a seguir, es la de llamar igual a la vista y el controlador. Para que sea fácil buscarlo.

Creamos el componente de la cabecera:

Ahora vamos a crear el componente cabecera, que tendrá el selector dbpCabecera .

/app/component/comun/cabecera.component.html

<p> Aqui ira la cabecera </p>

/app/component/comun/cabecera.component.ts


import {Component} from 'angular2/core';
@Component({
  selector:'dpbCabecera',
  templateUrl:'/app/component/comun/cabecera.component.html'
})
export class CabeceraComponent{}


Creamos el componente del cuerpo:

Ahora vamos a crear el component cuerpo, que tendrá el selector dbpCuerpo.

/app/component/comun/cuerpo.component.html

<p> Aqui ira el código del cuerpo </p>
/app/component/comun/cuerpo.component.ts


import {Component} from 'angular2/core';

@Component({
  selector:'dbpCuerpo',
  templateUrl:'/app/component/comun/cuerpo.component.html'
})
export class CupoerComponent{}


Creamos el componente del pie

Ahora vamos a crear el componente del pie, que tendrá el selector dbpPie

/app/component/comun/pie.component.html
<p>Aqui ira el código del pie</p>
/app/component/comun/pie.component.ts

import {Component} from 'angular2/core';
@Component({
  selector:'dpbPie',
  templateUrl:'/app/component/comun/pie.component.html'
})
export class PieComponent{}

Ahora que ya tenemos creados los 3 componentes que van a representar las regiones de pantalla que hemos detallado al principio del articulo, tenemos que ver como vamos a vincular a nuestro componente principal, estos tres componentes.

Asociamos a los componentes nuevos a la aplicación.

Antes de nada aquí vamos a ver un primer ejemplo que angular 2 la forma que tiene de construir la pantalla, es con un árbol de componente que se irán asociando y se puede comunicar entre ellos. Para lo cual tenemos que realizar 2 cosas:

  • Asociar el componente al controlador.
  • Indicar en la plantilla del componente padre donde vamos a pintar cada uno de los componentes.

Asociar al controlador:

En este caso lo que vamos hace es indicarle al componente donde se encuentran sus hijos para lo cual por un lado lo tenemos que importar por un lado el componente y por otro lado pasárselos al componente con el parámetro directives.


import {Component} from 'angular2/core';
import {CabeceraComponent} from './component/comun/cabecera.component';
import {CuerpoComponent} from './component/comun/cuerpo.component';
import {PieComponent} from './component/comun/pie.component';
@Component({
  selector:'my-app',
  templateUrl:'/app/app.component.html',
  directives:[CabeceraComponent,CuerpoComponent,PieComponent]
})
export class AppComponent{};

Indicarlo en la plantilla donde ira cada componente

Ahora solo tenemos que indicar, donde vamos a pintar cada uno de los elementos en la pantalla de la aplicación.
<dpbCabecera></dpbCabecera>
<dbpCuerpo></dbpCuerpo>
<dpbPie></dpbPie>

Conclusión

Como podemos ver en este articulo, por un lado que separa la vista del controlador, como se monta un árbol de componente básicos y como se pueden asociar.


lunes, 18 de enero de 2016

Como empezar con "Angular 2" (BETA)

Acaba de salir hace poco la beta de angular 2, y vamos a ver como crear la estructura básica de un proyecto , para lo cual el articulo lo vamos a dividir en 3 partes:
  • Que es angular 2.
  • Configurar nuestro entorno de desarrollo. 
  • Estructura básica de un proyecto de angular 2.
Ojo, hay que tener en cuenta que este articulo se ha realizado con la beta.0 y pueden cambiar algunas cosas. 
En la siguiente url  os podéis descargar el proyecto  de este articulo 

¿Que nos ofrece angular 2?

Antes de utilizar un framework tenemos que saber que nos ofrece y si nos merece la pena.
  • Esta pensado para poder hacer aplicaciones mobiles y proporcionarnos mecanismos, que nos permitan realizar las performance. 
  • Es mas rápido, ya que las actualizaciones se hacen sobre los datos y no en el árbol DOM.
  • Flexible:
    • Múltiples lenguajes:
      • javascript
      • typescript (Este es el que recomiendan y vamos a usar nosotros).
      • dart
    • Mezcla por una lado el estilo de objetos (Clases y decorators (anotaciones de java)), mas la programación funcional y reactiva (para los flujos de datos).
Esto es lo que nos dice la gente de angular 2, yo al menos el ultimo punto por lo que he visto les ha quedado bastante bien, al menos para la gente que venimos del mundo de spring. De las aplicaciones mobiles tampoco piloto tanto para juzgarlo, pero por lo poco que he leído si lo están teniendo en cuanto al menos en el ancho de banda y otras historias. 

Herramientas que vamos a usar:

 Se necesitan las siguientes herramientas, para poder trabajar:
  • nodejs: Para descargar las herramientas necesarias.
  • atomjs: Usaremos el editor de texto atom, que se integra con github + el pluging de typescript
  • pluging de typescript: Instalamos en atom el siguiente pluging https://atom.io/packages/atom-typescript.
Estas herramientas, solo las vamos a tener que instalar.

Dependencias que vamos a necesitar:

Ahora que tenemos las herramientas, vamos a ver las dependencias que vamos a necesitar para poder trabajar a angular 2:
  • angular2: la versión (2.0.0-beta.0).
  • systemjs: la versión (0.19.6).
  • es6-promise: la versión (3.0.2).
  • es6-shim: la versión (0.33.3).
  • reflect-metadata: la versión (0.1.2).
  • rxjs: la versión (5.0.0-beta.0).
  • zone.js: la versión (0.5.10).
Las dependencias de desarrollo
  • concurrently: la versión (1.0.0)
  • lite-server: la versión (1.3.1)
  • typescript: la versión (1.7.3)
Para poder configurar todas estas dependencias vamos a utilizar el fichero de package.json

{
  "name": "angular2-holamund",
  "version": "1.0.0",
  "license": "ISC",
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "concurrently": "^1.0.0",
    "lite-server": "^1.3.1",
    "typescript": "^1.7.3"
  }
}

Una vez que hemos creado el fichero de package.json, lo siguiente que tenemos que hacer es ponerlos en el directorio del proyecto y ejecutar el siguiente comando:
npm install
Una vez ejecutado este comando, se crear en la carpeta de node_modules, todas las dependencias que hemos puesto.

 Configurar el atom

Ahora vamos a ver como configurar en atom el typescript, para lo cual en la consola (ctrl + shift + p) de atom escribimos este comando "create tsconfig.json", ahora nos crea el fichero de tsconfig.json que le indica al compilador como tiene que trabajar typescript. Del fichero que nos genera yo le cambio el parámetro de buildOnSave a true, para que cada vez que se guarda un cambio se compilen los ficheros. Y para poder depurar establecemos el parámetro, "sourceMap".

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
         "sourceMap": true,
        "isolatedModules": false,
        "jsx": "react",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "declaration": false,
        "noImplicitAny": false,
        "removeComments": true,
        "noLib": false,
        "preserveConstEnums": true,
        "suppressImplicitAnyIndexErrors": true
    },
    "filesGlob": [
        "**/*.ts",
        "**/*.tsx",
        "!node_modules/**"
    ],
    "compileOnSave": true,
    "buildOnSave": true,
    "files": [
        "boot.ts"
    ],
    "atom": {
        "rewriteTsconfig": true
    }
}
Ahora ya podemos trabajar con typescript en atom, 

Configurar el git

En nuestro ejemplo no vamos a guardar en el control de versiones:
  • *.js: Son los ficheros que se generar de los ts.
  • *.map: Son los map que generar de los ts, para la deuperación.
  • node_modules: Es un fichero de trabajo de node, que no tenemos que subir el control de versiones.
Fichero: .gitignore
*.js
*.map
node_modules

Ahora en el directorio raíz creamos este fichero, y ademas estos ficheros ya no se verán en el atom.

Configurar el nodejs

Ahora que ya tenemos configuradas las dependencias, el editor de texto y el control de versiones. Solo nos falta montar en el nodejs, un compilador de typscript y un servidor ligero para poder trabajar. Para lo cual ampliaremos el fichero package.json, ahora vamos a definir el modulo de scripts:
  • Lanzar el servidor ("start": "live-server"). npm start
Así quedaría el fichero package.json

{
  "name": "angular2-holamund",
  "version": "1.0.0",
  "license": "ISC",
  "scripts": {
    "tsc": "tsc -p app -w",
    "start": "live-server"
  },
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "concurrently": "^1.0.0",
    "lite-server": "^1.3.1",
    "typescript": "^1.7.3"
  }
}

Ya tenemos configurado nuestro entorno para empezar a trabajar con angular 2, cuento todos estos pasos por que al menos para mi la primera vez me llevo algo de tiempo montar toda la infraestructura de primeras.

Estructura de nuestro proyecto

En este apartado vamos a ver los ficheros que vamos a necesitar para montar nuestro ejemplo.

A continuación vamos a ver los ficheros que tenemos que crear.

/
/app
/app/app.component.ts
/app/boot.ts
/index.html

Los fuentes los vamos a colocar en la carpeta app. Y el fichero donde va estar la pagina principal index.html lo ponemos en la basé del proyecto. 

Ahora vamos a ver el orden en el que vamos a seguir para escribir nuestra primera aplicación:
  1. Crear el componente de la aplicación (app.component.ts).
  2. Configurar el arranque de la aplicación (boot.ts).
  3. Escribir la pagina principal (index.html).  

Componente de aplicación (app.component.ts)

En este fichero vamos a crear el componente raiz, a partir del cual vamos a construir nuestra aplicación. 

En este fichero vamos a ver 3 cosas:
  • Como importar los recursos .  En nuestro caso sera el decorador @Component.
  • El atributo de componente selector, que sera un selector de la css, donde va a pintar angular 2 el componente.
  • El atributo de component template, que representa la región  de pantalla del controlador.
También tendremos la clase controlador, donde estará la lógica que gestiona el trozo de pantalla que podemos llamar vista. En nuestro ejemplo esta vacía ya que nuestra aplicación solo va a pintar hola mundo.

import {Component} from 'angular2/core';
@Component({
  selector: 'my-app',
  template:' Hola Mundo.'
})
export class AppComponent {}

Aquí es donde crearemos el esqueleto de nuestra aplicación de los componentes que siempre se verán en pantalla, como por ejemplo (El pie, el encabezado,cuerpo)...

Arranque de la aplicación (boot.ts)

Este fichero es el encargado de arrancar angular y establecer las configuraciones. En nuestro ejemplo solo le vamos a indicar cual va ser el componente raíz de la aplicación (AppComponent).


import {bootstrap}    from 'angular2/platform/browser'
import {AppComponent} from './app.component';

bootstrap(AppComponent);

Todos los servicios que se inyecten a este nivel los vera toda la aplicación y compartirán la misma instancia (vamos que sera un singlenton). Ojo en angular tambien podemos inyectar servicios en el contexto de los controladores...

Pagina principal (index.html)

Representa la pagina web, que sera la responsable de cargar nuestra aplicación. En la pagina vamos a tener 3 secciones diferenciadas.
  • Las librerías de javascript que vamos a utilizar. (es6-shim.js, angular2-polyfills, system.src.js, rx.js, angular2)
  • Configuración de systemjs (que es la herramienta encargada de cargar los módulos).
    • Por un lado le indicamos que vamos a registrar todos los ficheros que estan dentro de la carpeta app, con la extensión js.
    • Por otro lado le indicamos donde se encuentra el fichero por el que vamos a arrancar la aplicación.
  • Indicar la selección de la región de pantalla donde vamos a pintar la aplicación. Se cargar en la sección de pantalla de my-app.
...
<html>
  <head>
      <title> Angular 2 (Hola mundo)</title>

      <!-- 1. Cargamos las librerias -->
      <script src="node_modules/es6-shim/es6-shim.js"></script>
      <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
      <script src="node_modules/systemjs/dist/system.src.js"></script>
      <script src="node_modules/rxjs/bundles/Rx.js"></script>
      <script src="node_modules/angular2/bundles/angular2.dev.js"></script>

      <!-- 2. Configirar SystemJS -->
      <script>
        System.config({
          packages: {
                  'app': {defaultExtension: 'js' }
                }
          });
        System.import('app/boot')
              .then(null, console.error.bind(console));
      </script>
  </head>
  <body>
      <my-app> Cargando ...</my-app>
  </body
...

Ahora solo nos falta, arrancar la aplicación, con el comando npm start y ver como nos saluda la aplicación.