Take a look at my modified plunker: https://plnkr.co/edit/YHzyzm6ZXt4ESr76mNuB?p=preview
- Added a
Pipe
to the dashboard.component.ts
@Pipe({
name: 'filterHeros'
})
export class FilterHeroPipe {
public transform(heros: Hero[], filter: string) {
if (!heros || !heros.length) return [];
if (!filter) return heros;
return heros.filter(h => h.name.toLowerCase().indexOf(filter.toLowerCase()) >= 0);
}
}
- Use this
Pipe
inside of that dashboard.template
<h3>Top Heroes</h3>
<div class="grid grid-pad">
<a *ngFor="let hero of (heroes | filterHeros : heroSearch.curSearch )" [routerLink]="['/detail', hero.id]" class="col-1-4">
<div class="module hero">
<h4>{{hero.name}}</h4>
</div>
</a>
</div>
<br />
<hero-search #heroSearch></hero-search>
- Change that
HeroSearch
component:
private searchTerms = new Subject<string>();
public curSearch: string; // !! NEW !!
constructor(
private heroSearchService: HeroSearchService,
private router: Router) {}
// Push a search term into the observable stream.
search(term: string): void {
this.curSearch = term; // !! NEW !!
this.searchTerms.next(term);
}
- don't forget to add our
Pipe
to our app.module:
import { DashboardComponent, FilterHeroPipe } from './dashboard.component';
import { HeroesComponent } from './heroes.component';
import { HeroDetailComponent } from './hero-detail.component';
import { HeroService } from './hero.service';
import { HeroSearchComponent } from './hero-search.component';
@NgModule({
imports: [
BrowserModule,
FormsModule,
HttpModule,
InMemoryWebApiModule.forRoot(InMemoryDataService),
AppRoutingModule
],
declarations: [
AppComponent,
DashboardComponent,
HeroDetailComponent,
HeroesComponent,
HeroSearchComponent,
FilterHeroPipe
],
providers: [ HeroService ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
custom pipe
which filters yourheroes
array based on the search string (in the answer calledfilterargs
) – lenny