Pada modul ini kita akan restruktur component recipe-list. Tujuannya adalah ketika item recipe di-click, recipe detail akan ditampilkan.
Pendekatan yang dilakukan adalah sama seperti yang sudah dibahas pada modul navigasi, yaitu menggunakan custom event binding.
Buka file recipe-list.component.html, lalu tambahkan event binding (click)=”onSelect(recipeLoop)”
<div class="row">
<div class="col-xs-12">
<button class="btn btn-success">New Recipe</button>
</div>
</div>
<hr>
<div class="row">
<div class="col-xs-12">
<app-recipe-item *ngFor="let recipeLoop of recipes"
[recipe]="recipeLoop"
(click)="onSelect(recipeLoop)"
>
</app-recipe-item>
</div>
</div>
Kemudian edit file recipe-list.component.ts, tambahkan method onSelect.
//tambahkan module Output jika IDE tidak otomatis melakukan import
import { Component, EventEmitter, OnInit, Output } from '@angular/core';
import { Recipe } from '../recipe.model';
@Component({
selector: 'app-recipe-list',
templateUrl: './recipe-list.component.html',
styleUrls: ['./recipe-list.component.css']
})
export class RecipeListComponent implements OnInit {
//untuk event binding ketika recipe item dipilih
@Output() recipeSelected = new EventEmitter<Recipe>();
recipes: Recipe[] = [
new Recipe('Oreo Dorayaki 1', 'Doriyaki dengan bahan utama Oreo', 'https://i.ytimg.com/vi/nJGmdqb892Y/maxresdefault.jpg' ),
new Recipe('Oreo Dorayaki 2', 'Doriyaki dengan bahan utama Oreo', 'https://i.ytimg.com/vi/nJGmdqb892Y/maxresdefault.jpg' )
]
constructor() { }
ngOnInit(): void {
}
//untuk event binding ketika recipe item dipilih
onSelect(recipe: Recipe){
this.recipeSelected.emit(recipe);
}
}
Berikutnya adalah menangkap data yang di emit, pada parent component yaitu pada file recipe.component.html.
Data yang ditangkap diatas, pasing data ke recipe-detail.component dengan property binding
<div class="row">
<div class="col-md-5">
<!-- menangkap data dari recipe-list.component -->
<app-recipe-list (recipeSelected)=" onRecipeSelected($event)"></app-recipe-list>
</div>
<div class="col-md-7">
<!-- set recipe yang dipilih dengan property binding-->
<app-recipe-detail
*ngIf="recipeSelected; else tempText"
[recipe]="recipeSelected"
>
</app-recipe-detail>
<ng-template #tempText><p>Please select recipe..</p></ng-template>
</div>
</div>
Kemudian pada recipe.component.ts, tambahkan method untuk menangkap data custom event dari recipe-list.component
import { Component, OnInit, Input} from '@angular/core';
import { Recipe } from './recipe.model';
@Component({
selector: 'app-recipes',
templateUrl: './recipes.component.html',
styleUrls: ['./recipes.component.css']
})
export class RecipesComponent implements OnInit {
@Input() recipeSelected! : Recipe;
constructor() { }
ngOnInit(): void {
}
onRecipeSelected(recipe : Recipe){
this.recipeSelected = recipe;
}
}
Berikutnya edit file recipe-detail.component.ts, tambahkan property yang akan digunakan untuk menerima data dari recipe.component.
import { Component, OnInit, Input } from '@angular/core';
import { Recipe } from '../recipe.model';
@Component({
selector: 'app-recipe-detail',
templateUrl: './recipe-detail.component.html',
styleUrls: ['./recipe-detail.component.css']
})
export class RecipeDetailComponent implements OnInit {
@Input() recipe! : Recipe;
constructor() { }
ngOnInit(): void {
}
}
Berikutnya edit file recipe-detail.component.html, gunakan string interpolation untuk menggunakan property recipe diatas.
<div class="row">
<div class="col-xs-12">
<img [src]="recipe.imgPath" alt="{{recipe.name}}" class="img-fluid" style="max-height:240px;">
</div>
</div>
<div class="row">
<div class="col-xs-12">
<h1>{{recipe.name}}</h1>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Manage Recipe
</button>
<ul class="dropdown-menu" aria-labelledby="btnGroupDrop1">
<li><a class="dropdown-item" href="#">Add to Shopping List</a></li>
<li><a class="dropdown-item" href="#">Edit Recipe</a></li>
<li><a class="dropdown-item" href="#">Delete Recipe</a></li>
</ul>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">{{recipe.description}}</div>
</div>
<div class="row">
<div class="col-xs-12">
Ingredients
</div>
</div>
Jika kita check pada browser, sesuai ekspektasi, menu detail akan ditampilkan sesuai recipe item yang dipilih.