|
1 | | -import { Component } from '@angular/core'; |
2 | | -import { Item } from './item'; |
| 1 | +import {AfterViewInit, ChangeDetectorRef, Component, ElementRef, NgZone, ViewChild} from '@angular/core'; |
3 | 2 |
|
4 | | -@Component({ |
5 | | - selector: 'app-root', |
6 | | - templateUrl: './app.component.html', |
7 | | - styleUrls: ['./app.component.css'] |
8 | | -}) |
9 | | -export class AppComponent { |
| 3 | +import {Item} from './item'; |
10 | 4 |
|
11 | | - currentItem = { name: 'teapot'} ; |
| 5 | +@Component( |
| 6 | + {selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css']}) |
| 7 | +export class AppComponent implements AfterViewInit { |
| 8 | + @ViewChild('btnToggle') btnToggle: ElementRef; |
| 9 | + currentItem = {name: 'teapot'}; |
12 | 10 | clickMessage = ''; |
| 11 | + zoneMessage = ''; |
| 12 | + |
| 13 | + show = false; |
| 14 | + |
| 15 | + constructor(private ngZone: NgZone, private cdr: ChangeDetectorRef) {} |
| 16 | + |
| 17 | + ngAfterViewInit() { |
| 18 | + this.ngZone.runOutsideAngular(() => { |
| 19 | + const el = this.btnToggle.nativeElement as HTMLElement; |
| 20 | + el.addEventListener('click', e => { |
| 21 | + this.show = true; |
| 22 | + this.cdr.detectChanges(); |
| 23 | + }) |
| 24 | + }) |
| 25 | + } |
13 | 26 |
|
14 | 27 | onSave(event?: KeyboardEvent) { |
15 | 28 | const evtMsg = event ? ' Event target is ' + (<HTMLElement>event.target).textContent : ''; |
16 | 29 | alert('Saved.' + evtMsg); |
17 | | - if (event) { event.stopPropagation(); } |
| 30 | + if (event) { |
| 31 | + event.stopPropagation(); |
| 32 | + } |
18 | 33 | } |
19 | 34 |
|
20 | 35 | deleteItem(item: Item) { |
21 | 36 | alert(`Delete the ${item.name}.`); |
22 | 37 | } |
23 | 38 |
|
24 | 39 | onClickMe(event?: KeyboardEvent) { |
25 | | - const evtMsg = event ? ' Event target class is ' + (<HTMLElement>event.target).className : ''; |
| 40 | + const evtMsg = event ? ' Event target class is ' + (<HTMLElement>event.target).className : ''; |
26 | 41 | alert('Click me.' + evtMsg); |
27 | 42 | } |
28 | 43 |
|
| 44 | + handleClickOnParentDiv() { |
| 45 | + alert('clicked on parent'); |
| 46 | + } |
| 47 | + |
| 48 | + handleClickOnChildDiv() { |
| 49 | + alert('clicked on child'); |
| 50 | + } |
| 51 | + |
| 52 | + handleScroll(event?: Event) { |
| 53 | + event.preventDefault() |
| 54 | + alert(`preventDefault does not work in passive event handler, ${event.defaultPrevented}`) |
| 55 | + } |
| 56 | + |
| 57 | + handleOnceClick() { |
| 58 | + alert('this handle should only be called once'); |
| 59 | + } |
| 60 | + |
| 61 | + handleClickWithMixedOptions() {} |
| 62 | + |
| 63 | + clickInNoopZone() { |
| 64 | + this.zoneMessage = |
| 65 | + NgZone.isInAngularZone() ? `inside the angular zone` : 'outside of the angular zone'; |
| 66 | + } |
| 67 | + |
| 68 | + clickInNgZone() { |
| 69 | + this.zoneMessage = |
| 70 | + NgZone.isInAngularZone() ? `inside the angular zone` : 'outside of the angular zone'; |
| 71 | + } |
29 | 72 | } |
0 commit comments