Implement duck search by color
This is a very rough thing. In the final version it should provide resilts with similar colors. Signed-off-by: Gergely Polonkai <gergely@polonkai.eu>
This commit is contained in:
parent
267b229e13
commit
bfcabd7925
@ -1,3 +1,5 @@
|
|||||||
|
import "./rxjs-extensions";
|
||||||
|
|
||||||
import { NgModule } from "@angular/core";
|
import { NgModule } from "@angular/core";
|
||||||
import { BrowserModule } from "@angular/platform-browser";
|
import { BrowserModule } from "@angular/platform-browser";
|
||||||
import { FormsModule } from "@angular/forms";
|
import { FormsModule } from "@angular/forms";
|
||||||
@ -12,6 +14,7 @@ import { AppComponent } from "./app.component";
|
|||||||
import { DucksComponent } from "./ducks.component";
|
import { DucksComponent } from "./ducks.component";
|
||||||
import { DuckDetailComponent } from "./duck-detail.component";
|
import { DuckDetailComponent } from "./duck-detail.component";
|
||||||
import { DashboardComponent } from "./dashboard.component";
|
import { DashboardComponent } from "./dashboard.component";
|
||||||
|
import { DuckSearchComponent } from "./duck-search.component";
|
||||||
|
|
||||||
import { DuckService } from "./duck.service";
|
import { DuckService } from "./duck.service";
|
||||||
|
|
||||||
@ -27,6 +30,7 @@ import { DuckService } from "./duck.service";
|
|||||||
AppComponent,
|
AppComponent,
|
||||||
DucksComponent,
|
DucksComponent,
|
||||||
DuckDetailComponent,
|
DuckDetailComponent,
|
||||||
|
DuckSearchComponent,
|
||||||
DashboardComponent
|
DashboardComponent
|
||||||
],
|
],
|
||||||
providers: [ DuckService ],
|
providers: [ DuckService ],
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
<div *ngFor="let duck of ducks" (click)="gotoDetail(duck)">
|
<div *ngFor="let duck of ducks" (click)="gotoDetail(duck)">
|
||||||
{{ duck.color }}
|
{{ duck.color }}
|
||||||
</div>
|
</div>
|
||||||
|
<duck-search></duck-search>
|
||||||
|
11
app/duck-search.component.html
Normal file
11
app/duck-search.component.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<div id="search-component">
|
||||||
|
<h4>Duck search</h4>
|
||||||
|
<input #searchBox id="search-box" (keyup)="search(searchBox.value)">
|
||||||
|
<div>
|
||||||
|
<div *ngFor="let duck of ducks | async"
|
||||||
|
(click)="gotoDetail(duck)"
|
||||||
|
class="search-result">
|
||||||
|
{{ duck.color }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
43
app/duck-search.component.ts
Normal file
43
app/duck-search.component.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { Component, OnInit } from "@angular/core";
|
||||||
|
import { Router } from "@angular/router";
|
||||||
|
import { Observable } from "rxjs/Observable";
|
||||||
|
import { Subject } from "rxjs/Subject";
|
||||||
|
|
||||||
|
import { DuckSearchService } from "./duck-search.service";
|
||||||
|
import { Duck } from "./models";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: "duck-search",
|
||||||
|
templateUrl: "/app/duck-search.component.html",
|
||||||
|
providers: [ DuckSearchService ]
|
||||||
|
})
|
||||||
|
export class DuckSearchComponent implements OnInit {
|
||||||
|
ducks: Observable<Duck[]>;
|
||||||
|
private searchTerm = new Subject<string>();
|
||||||
|
|
||||||
|
constructor(private duckSearchService: DuckSearchService,
|
||||||
|
private router: Router)
|
||||||
|
{}
|
||||||
|
|
||||||
|
search(term: string): void {
|
||||||
|
this.searchTerm.next(term);
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.ducks = this.searchTerm
|
||||||
|
.debounceTime(300) // wait for 300ms pause in events
|
||||||
|
.distinctUntilChanged() // ignore if next search term is same as previous
|
||||||
|
.switchMap(term => term // switch to new observable each time
|
||||||
|
? this.duckSearchService.search(term)
|
||||||
|
: Observable.of<Duck[]>([]))
|
||||||
|
.catch(error => {
|
||||||
|
console.log(error);
|
||||||
|
return Observable.of<Duck[]>([]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
gotoDetail(duck: Duck): void {
|
||||||
|
let link = ['/detail', duck.id];
|
||||||
|
this.router.navigate(link);
|
||||||
|
}
|
||||||
|
}
|
15
app/duck-search.service.ts
Normal file
15
app/duck-search.service.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { Injectable } from "@angular/core";
|
||||||
|
import { Http, Response } from "@angular/http";
|
||||||
|
import { Observable } from "rxjs";
|
||||||
|
|
||||||
|
import { Duck } from "./models";
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class DuckSearchService {
|
||||||
|
constructor (private http: Http) {}
|
||||||
|
|
||||||
|
search(term: string): Observable<Duck[]> {
|
||||||
|
return this.http.get(`app/ducks/?color=${term}`)
|
||||||
|
.map((r: Response) => r.json().data as Duck[]);
|
||||||
|
}
|
||||||
|
}
|
12
app/rxjs-extensions.ts
Normal file
12
app/rxjs-extensions.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Observable class extensions
|
||||||
|
import "rxjs/add/observable/of";
|
||||||
|
import "rxjs/add/observable/throw";
|
||||||
|
|
||||||
|
// Observable operators
|
||||||
|
import "rxjs/add/operator/catch";
|
||||||
|
import "rxjs/add/operator/debounceTime";
|
||||||
|
import "rxjs/add/operator/distinctUntilChanged";
|
||||||
|
import "rxjs/add/operator/do";
|
||||||
|
import "rxjs/add/operator/filter";
|
||||||
|
import "rxjs/add/operator/map";
|
||||||
|
import "rxjs/add/operator/switchMap";
|
Loading…
Reference in New Issue
Block a user