class: center, middle
Komponens osztályok:
- tagváltozók
- metódusok
HTML sablon (template):
- inline vagy külön .html fájlban
class: center, middle
{{ kifejezés }}
export class Component {
title: string;
value: number;
complex: {
value: number
};
}
<h1>{{title}}<h1>
<span data="{{value + 1}}"></span>
<span>{{complex?.value}}</span> <!-- safe navigation operator -->
{{1 + 1 + 2}}
Hivatkozás más komponensre:
<libra-book></libra-book>
<div *ngIf="value">
Helló Világ!
</div>
<ng-container *ngIf="value === 5">
<div>Helló Világ!</div>
</ng-container>
export class Component {
items : {name: string, value: number}[];
}
<ul>
<li *ngFor="let item of items">{{item.name}} ({{item.value}})</li>
<ul>
class Component {
counter : number = 0;
onClickMe() {
this.counter++;
}
}
<button (click)="onClickMe()">Click me!</button>
{{counter}}
class: center, middle
Amikor a komponens állapota (bármely property-je) módosul, a HTML-t újra legeneráljuk.
class Component {
counter : number = 0;
onClickMe(ev : MouseEvent) {
console.log(ev.target);
this.counter++;
}
}
<button (click)="onClickMe($event)">Click me!</button>
{{counter}}
$event
: Angular bepített neve az esemény paraméterére (mindig csak 1 van)- MouseEvent: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
Okos szűrések: pl. keyup.enter
class Component {
onEnter(boxValue) {
this.value = boxValue;
}
value: string;
}
<input #box (keyup.enter)="onEnter(box.value)">
<p>{{value}}</p>
<input #box (keyup.enter)="onEnter(box.value)">
<p>{{value}}</p>
#box
: egy adott komponens azonosítója (csak a template-en belül)- A paragrafus tartalma frissül, amikor entert nyomunk a szövegdobozban
(click)="myFunction()"
(dblclick)="myFunction()"
(submit)="myFunction()"
(blur)="myFunction()"
(focus)="myFunction()"
(scroll)="myFunction()"
(cut)="myFunction()"
(copy)="myFunction()"
(paste)="myFunction()"
(keyup)="myFunction()"
(keypress)="myFunction()"
(keydown)="myFunction()"
(mouseup)="myFunction()"
(mousedown)="myFunction()"
(mouseenter)="myFunction()"
(drag)="myFunction()"
(drop)="myFunction()"
(dragover)="myFunction()"
class Component {
isButtonDisabled: boolean = false;
toggle() {
this.isButtonDisabled = !this.isButtonDisabled;
}
}
<button (click)="toggle()" [disabled]="isButtonDisabled">Click me</button>
disabled
: HTML DOM attribútum, amit elrejt a[disabled]
property- Értéke az
isButtonDisabled
értéke (false
, vagytrue
)
@Component({
selector: 'book',
//...
})
class BookComponent {
@Input() title : string;
@Input() isbn: string;
@Input() author: {
firstName: string;
lastName: string;
}
}
<span style="font-style: italic">{{title}}</span> ({{isbn}})
<span style="font-size: smaller">
{{author?.firstName}}, {{author?.lastName}}
</span>
class Component {
book : {
title: string;
isbn: string;
author: {
firstName: string;
lastName: string;
}
}
}
<book [title]="book.title" isbn="{{book.isbn}}" [author]="book.author"><book>
[]
(box-binding):
- Egyirányú adatkötés: az idézőjelben megadott kifejezés kiértékelődik, az eredménye átadódik
- nem kovertálódik stringgé
title
ésisbn
megadása ekvivalens, mert az érték, amit átadunk string
Nagyon sok beépített adatkötési direktíva van:
(esemény)
[class.valami]="bool kifejezés"
[style]="stílus objektum"
[style.font-weight]="font weight értéke"
- ...
@Component({
selector: 'counter'
//...
})
class CounterComponent {
@Output()
counterChange: EventEmitter<number> = new EventEmitter();
counter : number;
onClicked() {
this.counter++;
this.counterChange.emit(this.counter);
}
}
<button (click)="onClicked()"></button
class Component {
counterValue: number;
onCounterChanged(newValue : number) {
this.counterValue = newValue;
}
}
<counter (counterChange)="onCounterChanged($event)"></counter>
{{counterValue}}
vagy:
<counter (counterChange)="counterValue = $event"></counter>
{{counterValue}}
@Component({
selector: 'counter'
//...
})
class CounterComponent {
@Output()
counterChange: EventEmitter<number> = new EventEmitter();
@Input()
counter : number;
onClicked() {
this.counter++;
this.counterChange.emit(this.counter);
}
}
<button (click)="onClicked()"></button
class Component {
counterValue: number = 5; //kezdő érték
onCounterChanged(newValue) {
this.counterValue = newValue;
}
}
<counter [(counter)]="counterValue"></counter>
{{counterValue}}
- Elnevezés fontos:
@Output
:@Input
+ Change postfix [(counter)]="counterValue"
a változó értéke az emittált érték lesz
Ekvivalens ezzel:
<counter [counter]="counterValue" (counterChange)="counterValue = $event">
</counter>
Adatkötés <input>
elemhez:
class Component {
userName: string;
}
<input [value]="userName"
(input)="userName=$event.target.value">
Alternatíva:
<input [(ngModel)]="userName">
FormsModule
-t importálni kell hozzá
Háromféle direktíva van angularban:
- Komponens:
<selector></selector>
- Struktúrális direktíva:
*ngIf
,*ngFor
- Attribútum direktíva: elemekre utólagosan ráaggattott attribútumok
- Például: tegyük fel, hogy szeretnénk több elemnek is megváltoztatni a hátterét
<p appHighlight>Highlight me!</p>
<button appHighlight>Highlight me!</button>
import { Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
constructor(el: ElementRef) {
el.nativeElement.style.backgroundColor = 'yellow';
}
}
- A direktívát ugyanúgy regisztrálni kell egy modulban, mint egy komponenst
Ennél többet is tudnak a direktívák:
- Komponenseket is ki lehet egészíteni velük
- Lehetnek paramétereik, pl:
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
@Input('appHighlight') color : string;
constructor(el: ElementRef) {
el.nativeElement.style.backgroundColor = this.color;
}
}
<p [appHighlight]="'yellow'">Highlight me!</p>
<button [appHighlight]="'green'">Highlight me!</button>