ANGULAR

Tworzymy aplikację

Do zainstalowania Typescript i Angulara potrzebujesz środowiska NodeJS.

Instalacja:
npm install -g @angular/cli

Po utworzeniu wpisz w linii komend:

ng new nazwa_aplikacji

Może to zająć kilka chwil. Po utworzeniu, przejdź do nazwa_aplikacji i uruchom w terminalu:
ng serve --open

Zbudowanie aplikacji w wersji dystrybucyjnej:

ng build

Tworzy on aplikację w czystym Javascript w katalogu dist/nazwa_aplikacji/ . Zwróć uwagę na generowany w pliku index.html wpis: <base href="/">. Zakłada on, że strona będzie uruchamiana z katalogu głównego (/).:

<html lang="en">
<head>
<meta charset="utf-8">
<base href="/">
</head>
<body>
<app-root></app-root>
<script>
// tu jest umieszcany wygenerowany kod
</script>
</body>
</html>

<app-root> jest komponentem aplikacji, który jest wywoływany, i to jest ten komponent, który wyrenderuje na ekranie. Sekcja <script></script> tworzona jest dopiero w czasie budowania aplikacji - nie ma jej we wzorcu strony.

Budujemy komponent

W katalogu src/app zbudujmy komponent na wzór wygenerowanego app.component - powielając przykład planszy do gry w kółko i krzyżyk. Nazwijmy ten komponent xo.component. W konsekwencji implementację zapisujemy w pliku src/app/xo.component.tx:

import { Component } from '@angular/core';

@Component({
  selector: 'xo-selector',
  template : `<table className="plansza">
   <tbody>
     <tr>
      <td x="0" y="0"> {{ xo[0] }} </td>
      <td x="1" y="0"> {{ xo[1] }} </td>
      <td x="2" y="0"> {{ xo[2] }} </td>
     </tr>
     <tr>
      <td x="0" y="1"> {{ xo[3] }} </td>
      <td x="1" y="1"> {{ xo[4] }} </td>
      <td x="2" y="1"> {{ xo[5] }} </td>
     </tr>
     <tr>
      <td x="0" y="2"> {{ xo[6] }} </td>
      <td x="1" y="2"> {{ xo[7] }} </td>
      <td x="2" y="2"> {{ xo[8] }} </td>
     </tr>
     <tr>
      <td colSpan="3">{{ stanGry }} </td>
     </tr>
   </tbody>
</table> 
`,
  styleUrls: ['./xo.component.css']
})
export class XoComponent {
  stanGry='KÓŁKO I KRYŻYK';
  xo = [' ',' ',' ',' ',' ',' ',' ',' ',' '];
}

W pliku xo.component.css umieszczamy style dla naszej planszy (można przekopiować z przykładu w React). Zamiast szablonu w postaci własności template możemy użyć własności templateUrl wskazującej na zewnętrzny plik xo.template.html:

templateUrl: './xo.component.html',

Użyliśmy selektora selector: 'xo-selector', aby przy okazji pokazać możliwość tworzenia strony z wielu komponentów. Nasz główny plik wzorca strony uzupełniamy o ww selektor:

<body>
  <app-root></app-root>
  <xo-selector></xo-selector>
</body>

Ostatnią rzeczą jaką musimy zrobić, to wskazać Angularowi powiązanie między aplikacją na użytym selektorem. Zmieniamy w tym celu definicję modułu w pliku src/app/app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { XoComponent } from './xo.component';

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

Jak widać importujemy komponent, a następnie dodajemy go do deklaracji oraz listy komponentów potrzebnych w chwili startu (bootstrap).

Uzyskujemy oczekiwany efekt - planszę 3x3.

Obsługa zdarzeń

Zmieńmy nieco nasz komponent - tak, aby obsłużyć zdarzenie onclick (kliknięcie):

export class XoComponent {
  stanGry: string ='KÓŁKO I KRYŻYK';
  public xo: Array<string>;

 constructor() {
  this.xo = [' ',' ',' ',' ',' ',' ',' ',' ',' '];
 }

 public click(event, n, item) {
  alert('Kliknąłem ['+n+']:' + item);
 }

}

Po wywołaniu metody click - wyświetli się komunikat potwierdzający poprawne wywołanie.

Musimy dodać takie wywołanie do każdej komórki naszej planszy:

     <tr>
      <td x="0" y="0" (click)="click($event, 0, xo[0])"> {{ xo[0] }} </td>
      <td x="1" y="0" (click)="click($event, 1, xo[1])"> {{ xo[1] }} </td>
      <td x="2" y="0" (click)="click($event, 2, xo[2])"> {{ xo[2] }} </td>
     </tr>
     <tr>
      <td x="0" y="1" (click)="click($event, 3, xo[3])"> {{ xo[3] }} </td>
      <td x="1" y="1" (click)="click($event, 4, xo[4])"> {{ xo[4] }} </td>
      <td x="2" y="1" (click)="click($event, 5, xo[5])"> {{ xo[5] }} </td>
     </tr>
     <tr>
      <td x="0" y="2" (click)="click($event, 6, xo[6])"> {{ xo[6] }} </td>
      <td x="1" y="2" (click)="click($event, 7, xo[7])"> {{ xo[7] }} </td>
      <td x="2" y="2" (click)="click($event, 8, xo[8])"> {{ xo[8] }} </td>
     </tr>

To powinno wystarczyć, aby kliknięcie w komórce planszy wywołało komunikat.

Jednak nam chodzi o to, by stan planszy się zmieniał, a nie tylko o śledzenie kliknięć. W Angularze jest to jeszcze prostsze niż w React. Nowa implementacja funkcji click():

public click(event, n, item) {
  let newitem : string = ' ';
  if (item==' ') newitem='x'
  else if (item=='x') newitem='o'; 
  this.xo[n]=newitem;
}

Angular jest dużo bardziej rozbudowanym frameworkiem, niż React. Pełny opis wykracza znacznie poza ramy niniejszej publikacji (w następnym rozdziale opisano jeszcze integrację z Redux).