Thử học Angular 5

Đối với một lập trình viên web, làm việc với javascipt là một kỹ năng không thể thiếu, để làm trang web sinh động và mang tính tương tác cao hơn. Thư viện Jquery đã làm làm rất tốt điều đó. Nhưng công nghệ thì luôn thay đổi và phát triển, Single Page Applications (SPA) đã trở nên phổ biến và phát triển cực kì mạnh mẽ và Angular (ngoài ra còn có React , Vue.Js ...) sinh ra để làm điều đó, cho dù những năm gần đây thị phần của Angular đang giảm đi bởi sự vươn lên mạnh mẽ của Vue.Js và React nhưng với sự cải tiến không ngừng của Angular, mới nhất là phiên bản Angula 5 thì nó vẫn rất đáng để học Trong bài viết này mình và các bạn sẽ cùng tìm hiểu cơ bản về Angular 5, phiên bản Angular mới nhất hiện nay. Và thử chạy ứng d

Tổng quan Angular

Angular là một nền tảng giúp xây dựng ứng dụng web dễ dàng. Ngoài ra có thể sử dụng Angular để viết native app cho di động hoặc desktop. Angular được google phát triển nên chúng ta có thể yên tâm về vấn đề phát triển lâu dài và cộng đồng hỗ trợ. Angular sử dụng Typescript để phát triển ứng dụng. TypeScript vừa có tính chặt chẽ của một ngôn ngữ có kiểu (kiểm tra kiểu dữ liệu ngay khi compile), vừa giữ được sự linh hoạt và gọn nhẹ của javascript, giúp cho angular phù hợp với tất cả các project ở mọi quy mô. Bài viết này chỉ tìm hiểu cơ bản về angular cho người mới bắt đầu muốn tìm hiểu về một framework

Kiến thức cơ bản

Để có thể bắt đầu học Angular thì chúng ta nên tìm hiểu trước về ECMAScript2015 (ES6) và Typescript.

Cài đặt môi trường

Trước khi cài đặt angular 5, máy tính của bạn phải được cài nodejs trước đã. Chắc hẳn máy ai cũng cài rồi, nếu các bạn chưa cài thì google rearch nhé, việc cài đặt nodejs rất đơn giản Chú ý : Angular 5 yêu cầu nodejs tối thiểu từ phiên bản 6.9.x và npm 3.x.x trở lên. Để kiểm tra phiên bản thì bạn có thể sử dụng câu lệnh node -vnpm -v nhé

Angular CLI

Tiếp theo chúng ta phải cài đặt angular CLI (Command Line Interface), Angular CLI giúp việc xây dựng ứng dụng Angular dễ dàng và nhanh chóng hơn. Nó có thể làm được rất nhều việc khởi tạo project, khởi tạo server, tự động sinh code, testing thậm chí là deploy ứng dụng. Để cài đặt chúng ta dùng câu lệnh

npm install -g @angular/cli

Khởi tạo project

Sau khi cài đặt xong angular CLI , để tiến hành khởi tạo project, gõ câu lệnh ng new projectName trong đó projectName là tên project của bạn, tên project của mình là todo

ng new todo

Sau khi câu lệnh chạy xong, ta cd vào thư mục project vừa tạo cd todo và gõ

ng server --open

ng server để khởi tạo server và --open để sau khi khởi tạo máy chủ sẽ mở một tab mới trên trình duyệt với địa chỉ server vừa được tạo. Mặc định khi tạo thì server của chúng ta có địa chỉ http://localhost:4200/. Cổng 4200 là cổng mặc định, có thể config lại cổng này trong file .angular-cli.json, việc thay đổi cổng lúc này là không cần thiết, cứ dùng cổng mặc đinh là ok rồi. sau khi khởi tạo server trình duyệt sẽ bật lên 1 tab với nội dung sau Vậy là đã khởi tạo server xong, tiếp theo ta sẽ tìm hiểu cấu trúc thư mục của project nhé Chú ý: Nếu các bạn chạy lện ng server --open mà bị lỗi như này thì các bạn mởi file package.json của project vừa tạo và thay đổi trong phần khai báo phiên bản @angular/cli trong phần devDependencies từ "@angular/cli": "1.6.6" thành "@angular/cli": "^1.6.6" sau đó chạy

npm update

sau khi update npm xong, các bạn chạy lại ng server --open thì sẽ không bị lỗi nữa, lỗi này mình cũng không rõ lắm nhưng có thể do sai lệch phiên bản giữa angular-cli trong máy và trong cấu hình package.json của project

Cấu trúc thư mục

todo

├── src // thư mục chính chứa code chúng ta viết
│   ├── app // thư mục chứa các compoent, service, module, route ...
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.spec.ts
│   │   ├── app.component.ts
│   │   └── app.module.ts
│   ├── environments // thư mục cài đặt các môi trường như develop, product
│   │   ├── environment.prod.ts
│   │   └── environment.ts
│   ├── index.html // trang html chính khi người dùng truy cập vào ứng dụng
│   ├── main.ts
│   ├── favicon.ico
│   ├── polyfills.ts
│   ├── styles.css
│   ├── test.ts
│   ├── tsconfig.app.json
│   ├── tsconfig.spec.json
│   └── typings.d.ts
├── e2e  // end-to-end tests cái này liên quan đến test, vì mới tìm hiểu nên tạm thời chúng ta đề cập đến test
├── angular-cli.json //config cho Angular CLI
├── karma.conf.js //unit test
├── package.json
├── protractor.conf.js //config 
├── README.md
└── tslint.json

Ở trên mình có commemt một số file và thư mục cần chú ý, các bạn muốn xem đầy đủ có thể xem tại đây

Tạo component đầu tiên

Để tạo component chúng ta sử dụng Angular CLI, với câu lệnh

ng generate component todo

được kết quả như sau

[email protected] MINGW64 /e/Lab/Javascript/angular/todo (master)
$ ng generate component todo
  create src/app/todo/todo.component.html (23 bytes)
  create src/app/todo/todo.component.spec.ts (614 bytes)
  create src/app/todo/todo.component.ts (261 bytes)
  create src/app/todo/todo.component.css (0 bytes)
  update src/app/app.module.ts (472 bytes)

Chạy xong Angular CLI đã tạo cho chúng ta 1 thư mục todo bên trong thư mục /src/app và sửa file src/app/app.module.ts, Angular CLI đã tự động import component HeaderComponent vào trong phần khai báo component trong decorator @NgModule . Thư mục todo đó chính là một component

todo.component.html chứa nội dung html todo.component.css chứa style todo.component.ts chứa phần sử lý data todo.component.spec.ts phục vụ cho việc test Mở file todo.component.html lên và copy nội dung html sau

<div class="container">
  <div class="col-md-6">
    <div class="todolist not-done">
     <h1>Todos</h1>
        <input type="text" class="form-control add-todo" placeholder="Add todo">
            <button id="checkAll" class="btn btn-success">Add Todo</button>
            
        <hr>
        <div>
            <input type="button" [class]="filter=='SHOW_ALL' ? 'btn btn-primary': 'btn btn-default'" value="All" (click)="changeFilter('SHOW_ALL')">
            <input type="button" [class]="filter==='IN_PROGRESS' ? 'btn btn-primary': 'btn btn-default'" value="In Process" (click)="changeFilter('IN_PROGRESS')">
            <input type="button" [class]="filter==='DONE' ? 'btn btn-primary' : 'btn btn-default'" value="Done" (click)="changeFilter('DONE')">
        </div>

        <hr>
        <ul id="sortable" class="list-unstyled" *ngFor="let todo of todos">
            <li class="ui-state-default">
                <div class="checkbox">
                    <label>
                        <input type="checkbox"  [(ngModel)]="!todo.completed" />{{ todo.name }}</label>
                </div>
            </li>
        </ul>
    </div>
</div>

mở tiếp file app.component.html lên, thay thế nội dung thành

<app-todo></app-todo>

file app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; // <-- NgModel lives here


import { AppComponent } from './app.component';
import { TodoComponent } from './todo/todo.component';


@NgModule({
  declarations: [
    AppComponent,
    TodoComponent
  ],
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

file todo.component.ts

import { Component, OnInit } from '@angular/core';
import  _findIndex  from 'lodash/findIndex';
import { _map } from  'lodash/map';

@Component({
  selector: 'app-todo',
  templateUrl: './todo.component.html',
  styleUrls: ['./todo.component.css']
})
export class TodoComponent implements OnInit {
  
  todoData: any = [
    {id: 1, name: 'Todo 1', completed: true},
    {id: 2, name: 'Todo 2', completed: false},
    {id: 3, name: 'Todo 3', completed: false},
    {id: 4, name: 'Todo 4', completed: true},
    {id: 5, name: 'Todo 5', completed: false}
  ];
  todos:any;
  filter: string = 'SHOW_ALL';
  constructor() { }
  
  ngOnInit() {
    this.todos = this.todoData;
   }

  changeFilter(filter) {
    this.filter = filter;
    switch (filter) {
      case 'SHOW_ALL':
      this.todos = this.todoData;
        break;
      case 'IN_PROGRESS':
        this.todos = this.todoData.filter(t => t.completed)
        console.log(this.todos)
        break;
      case 'DONE':
        this.todos = this.todoData.filter(t => !t.completed)
        console.log(this.todos)
        break;
    }
  }
}

Các bạn quay lại tab ban đầu mở project, lúc này trình duyệt đã reload lại và hiển thị nội dung là todo mà chúng ta tạo Ấn vào các button để thay đổi bộ lọc thì danh sách todo cũng thay đổi theo. Vậy là đã tạo được component đầu tiên với một số chức năng nho nhỏ

Kết

Đây chỉ là bước đầu cho việc cài đặt và tìm hiểu cấu trúc project, vẫn còn một hàng dài các khái niệm và công nghệ trong Angular cần học như

  • ES6, Typescript
  • Angular CLI
  • Components
  • Dependency Injection
  • Directives
  • Form
  • Pipes
  • HTTP
  • Service
  • Routing

Bài này chỉ dừng lại ở việc giới thiệu và cài đặt angular 5 thôi. Bài tiếp theo chúng ta sẽ tìm hiểu rõ hơn về Component trong angular 5 nhé!

Tham khảo

HeroTutorial: https://angular.io/tutorial Angular 5 Quickstart: https://codecraft.tv/courses/angular/quickstart/overview/