* docs(toh-6/dart): refactoring of 'add, edit, delete heroes' Refactoring of "add, edit, delete heroes" section of toh-6 from one big bottom-up step into small independent feature slices, where the user achieves a "milesone" (i.e., can run the full app) after each feature section. The section rewrite is shorter and offers a better UX. Other simplifications: - Error handling is consistent: in the hero service we log to the console, everwhere else we just let errors bubble up. - Hero service methods renamed based on function (create, update) rather then lower-level implementation (post, put). - @Output properties have been eliminated (since they weren't explained). E2E tests now pass on both the TS and Dart sides. * docs(toh-6/ts): refactoring of 'add, edit, delete heroes' Refactoring of "add, edit, delete heroes" section of toh-6 from one big bottom-up step into small independent feature slices, where the user achieves a "milesone" (i.e., can run the full app) after each feature section. The section rewrite is shorter and offers a better UX. Other simplifications: - Error handling is consistent: in the hero service we log to the console, everwhere else we just let errors bubble up. - Hero service methods renamed based on function (create, update) rather then lower-level implementation (post, put). - @Output properties have been eliminated (since they weren't explained). E2E tests now pass on both the TS and Dart sides. Post-Dart-review updates included. * docs(toh-6): ward tweaks
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
// #docregion
 | 
						|
import { Component, OnInit } from '@angular/core';
 | 
						|
import { Router }            from '@angular/router';
 | 
						|
 | 
						|
import { Hero }                from './hero';
 | 
						|
import { HeroService }         from './hero.service';
 | 
						|
 | 
						|
@Component({
 | 
						|
  selector: 'my-heroes',
 | 
						|
  templateUrl: 'app/heroes.component.html',
 | 
						|
  styleUrls:  ['app/heroes.component.css']
 | 
						|
})
 | 
						|
export class HeroesComponent implements OnInit {
 | 
						|
  heroes: Hero[];
 | 
						|
  selectedHero: Hero;
 | 
						|
 | 
						|
  constructor(
 | 
						|
    private heroService: HeroService,
 | 
						|
    private router: Router) { }
 | 
						|
 | 
						|
  getHeroes(): void {
 | 
						|
    this.heroService
 | 
						|
        .getHeroes()
 | 
						|
        .then(heroes => this.heroes = heroes);
 | 
						|
  }
 | 
						|
 | 
						|
  // #docregion add
 | 
						|
  add(name: string): void {
 | 
						|
    name = name.trim();
 | 
						|
    if (!name) { return; }
 | 
						|
    this.heroService.create(name)
 | 
						|
      .then(hero => {
 | 
						|
        this.heroes.push(hero);
 | 
						|
        this.selectedHero = null;
 | 
						|
      });
 | 
						|
  }
 | 
						|
  // #enddocregion add
 | 
						|
 | 
						|
  // #docregion delete
 | 
						|
  delete(hero: Hero): void {
 | 
						|
    this.heroService
 | 
						|
        .delete(hero.id)
 | 
						|
        .then(() => {
 | 
						|
          this.heroes = this.heroes.filter(h => h !== hero);
 | 
						|
          if (this.selectedHero === hero) { this.selectedHero = null; }
 | 
						|
        });
 | 
						|
  }
 | 
						|
  // #enddocregion delete
 | 
						|
 | 
						|
  ngOnInit(): void {
 | 
						|
    this.getHeroes();
 | 
						|
  }
 | 
						|
 | 
						|
  onSelect(hero: Hero): void {
 | 
						|
    this.selectedHero = hero;
 | 
						|
  }
 | 
						|
 | 
						|
  gotoDetail(): void {
 | 
						|
    this.router.navigate(['/detail', this.selectedHero.id]);
 | 
						|
  }
 | 
						|
}
 |