domingo, 4 de diciembre de 2016

Un vistazo a Angular 2 y Typescript para el impaciente


Buscando un poquito me topé con este tutorial muy interesante, que trata sobre Angular 2 y Typescript. Lo desarrollé usando Ubuntu 16.10.

https://www.sitepoint.com/angular-2-tutorial/

El tutorial me pareció fácil, por lo que recomiendo seguirlo.

TL; DR. Lo que se necesita hacer para poder llegar a la aplicación de juguete es(obs: el tutorial no incluye los estilos, por lo que sale el formulario sin ellos):

- Instalar npm :
sudo apt install npm

- Instalar angular-cli
npm install -g angular-cli

Esto tardó un montón, y asumiendo que funcionó, debería poder verse la versión de npm con este comando
ng version

Ahora ya se puede crear el boilerplate de la aplicación:
ng new angular2-todo-app

Esto crea una estructura de directorios lista para trabajar. se puede probar que la aplicación funciona escribiendo en la terminal:
ng serve

Dentro del directorio de la aplicación creada.
Gracias a Typescript se puede aprovechar la bien conocida orientación a objetos. Para la aplicación de juguete del tutorial, basta con crear una clase Todo:
ng generate class Todo

Que solamente crea el fuente:
src/app/todo.ts

Probablemente angular-cli cambió en algunas cosas desde que se escribió el tutorial original. Admito que no pude correr ningún test, y para la aplicación de juguete, no creo que se demasiado necesario.
Al fuente creado anteriormente se le reemplaza los contenidos con lo que se muestra abajo:
 export class Todo {  
  id: number;  
  title: string = '';  
  complete: boolean = false;  
  constructor(values: Object = {}) {  
   Object.assign(this, values);  
  }  
 }  

Y si en el tutorial original se obvia todo lo de los test, se puede crear un service typescript de la siguiente manera:
ng generate service Todo

Éste fuente typescript maneja la lógica que se aplica sobre la clase Todo. Éste comando genera dos archivos
src/app/todo.service.spec.ts
src/app/todo.service.ts

El primero sirve para los test (no lo uso por esta vez) y el siguiente es en donde se escribe la lógica. Se puede reemplazar sin inconveniente el código que aparece en todo.service.ts por lo siguiente (exactamente igual que en el tutorial original):
 import { Injectable } from '@angular/core';
import {Todo} from './todo';
@Injectable()
export class TodoService {

 lastId: number = 0;

 todos: Todo[]=[];

 constructor() { }

 // Simulate POST /todos
 addTodo(todo: Todo): TodoService {
  if (!todo.id) {
   todo.id = ++this.lastId;
  }
  this.todos.push(todo);
  return this;
 }

 // Simulate DELETE /todos/:id
 deleteTodoById(id: number): TodoService {
  this.todos = this.todos
  .filter(todo => todo.id !== id);
  return this;
 }

 // Simulate PUT /todos/:id
 updateTodoById(id: number, values: Object = {}): Todo {
  let todo = this.getTodoById(id);
  if (!todo) {
   return null;
  }
  Object.assign(todo, values);
  return todo;
 }

 // Simulate GET /todos
 getAllTodos(): Todo[] {
  return this.todos;
 }

 // Simulate GET /todos/:id
 getTodoById(id: number): Todo {
  return this.todos
  .filter(todo => todo.id === id)
  .pop();
 }

 // Toggle todo complete
 toggleTodoComplete(todo: Todo){
  let updatedTodo = this.updateTodoById(todo.id, {
   complete: !todo.complete
  });
  return updatedTodo;
 }

}


Después de obviar los test si se puede pasar a la sección: Creating the TodoApp Component. Ahí es donde en el tutorial tuve que hacer algunas cosas un poquito distintas (tal vez por los cambios que va sufriendo Angular 2 y Typescript). Luego de generar el boilerplate del componente:
ng generate component TodoApp

Se tienen los siguientes fuentes, tal como el tutorial original:

src/app/todo-app/todo-app.component.css
src/app/todo-app/todo-app.component.html
src/app/todo-app/todo-app.component.spec.ts
src/app/todo-app/todo-app.component.ts
src/app/todo-app/index.ts

Ahora bien, en todo-app.component.html se puede reemplazar el código html por el que muestra en el tutorial (no lo muestro acá porque blogger interpreta que es código de la entrada).

Ahora bien, a partir de acá es donde encontré diferencias, y es cuando se debe reemplazar el código de src/app/todo-app/todo-app.component.ts. El mío quedó así, a diferencia del tutorial original:
 import { Component, OnInit } from '@angular/core';
import {TodoService} from '../todo.service';
import {Todo} from '../todo';

@Component({
 selector: 'app-todo-app',
 templateUrl: './todo-app.component.html',
 styleUrls: ['./todo-app.component.css'],
 providers: [TodoService]
})
export class TodoAppComponent implements OnInit {

 //constructor() { }

 ngOnInit() {
 }

 newTodo: Todo = new Todo();

 constructor(private todoService: TodoService) {
 }

 addTodo() {
  this.todoService.addTodo(this.newTodo);
  this.newTodo = new Todo();
 }

 toggleTodoComplete(todo) {
  this.todoService.toggleTodoComplete(todo);
 }

 removeTodo(todo) {
  this.todoService.deleteTodoById(todo.id);
 }

 get todos() {
  return this.todoService.getAllTodos();
 }

}



Y si le das en seco ng serve la página no funciona como se espera, ésto es porque en el tutorial original no se menciona que se debe modificar el archivo src/app/app.component.html, y reemplazarlo por lo siguiente:

<app-todo-app></app-todo-app>

Ésto sirve para que se rutee de la página principal a la aplicación todo. Con esto debería ser suficiente para que la aplicación funcione en http://localhost:4200/angular2-todo-app/

Por último, la parte que habla de subir el código a github pages no me funcionó, por lo que tuve que verlo por mi cuenta. Mi sugerencia es que se versione todo el código, porque al tratar de subir a github pages se reemplazan los fuentes por código optimizado. Les recomiendo seguir un tutorial para subir una aplicación angular a github pages. Algo como esto:

http://developer.telerik.com/featured/quick-angular-2-hosting-angular-cli-github-pages/

Tengan en cuenta, que el index.html del código generado necesita una modificación, a saber:

  <base href="/angular2-todo-app/">

Esto debe quedar así, porque o sino en github pages no resuelve bien los js ni css.

Al final la fuente de la demo se encuentra en

https://github.com/lgmore/angular2-todo-app/

en la rama master

y en

https://lgmore.github.io/angular2-todo-app/

se encuentra la aplicación de juguete funcionando. Cheers!!

No hay comentarios:

Publicar un comentario