Kita akan membahas penggunaan Local References dan @ViewChild pada component shopping-list.
Perhatian: akan diubah implementasi menjadi FormControl pada modul pembahasan Form. Tujuan modul ini untuk membahas penggunaan references dan @viewchild.
Proses yang dilakukan adalah, component akan menangkap perubahan pada input type menggunakan local reference dan @ViewChild.
Kemudian data ingredient yang sudah diperoleh dikirimkan ke parent component, untuk ditambahkan kedalam array ingredients dan kemudian ditampilkan.
Buka file shopping-edit.component.html, tambahkan local reference untuk input type text. Kemudian tambahkan juga event click pada Add button.
<div class="row">
<div class="col-xs-12">
<form>
<div class="row">
<div class="col-sm-5 form-group">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" id="name" #nameInput>
</div>
<div class="col-sm-2 form-group">
<label for="amount" class="form-label">Amount</label>
<input type="number" class="form-control" id="amount" #amountInput>
</div>
</div>
<div class="row mt-2">
<div class="col-xs-12">
<button class="btn btn-success me-1" type="submit" (click)="onAddItem()">
Add
</button>
<button class="btn btn-danger me-1" type="button">Del</button>
<button class="btn btn-primary" type="button">Clear</button>
</div>
</div>
</form>
</div>
</div>
Buka file shopping-edit.component.ts kemudian tambahkan
- Decorator @ViewChild untuk menangkap perubahan pada local reference.
- @Output EventEmiter untuk membroadcast data ke parent component.
- Method untuk menangani event onClick.
import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core';
import { Ingredient } from 'src/app/shared/ingredient.model';
@Component({
selector: 'app-shopping-edit',
templateUrl: './shopping-edit.component.html',
styleUrls: ['./shopping-edit.component.css']
})
export class ShoppingEditComponent implements OnInit {
@ViewChild('nameInput', {static:false}) nameInputRef!: ElementRef;
@ViewChild('amountInput', {static:false}) amountInputRef!: ElementRef;
@Output() ingredientAdded = new EventEmitter<Ingredient>();
constructor() { }
ngOnInit(): void {
}
onAddItem(){
const _name = this.nameInputRef.nativeElement.value;
const _amount = this.amountInputRef.nativeElement.value;
const newIngredient = new Ingredient(_name, _amount);
this.ingredientAdded.emit(newIngredient);
}
}
Selanjutnya buka file shopping-list.component.html, tambahkan code untuk menangkap data yang di-emit.
<div class="row">
<div class="col-xs-10">
<app-shopping-edit (ingredientAdded)="onIngredientAdded($event)"></app-shopping-edit>
<hr>
<ul class="list-group">
<a class="list-group-item" style="cursor:pointer" *ngFor="let ingredient of ingredients">
{{ingredient.name}} ({{ingredient.amount}})
</a>
</ul>
</div>
</div>
Kemudian buka file shopping-list.component.ts, tambahkan method untuk handling event penambahan ingredient dari shopping-edit.component.
import { Component, OnInit } from '@angular/core';
//import ingredient model
import { Ingredient } from '../shared/ingredient.model';
@Component({
selector: 'app-shopping-list',
templateUrl: './shopping-list.component.html',
styleUrls: ['./shopping-list.component.css']
})
export class ShoppingListComponent implements OnInit {
//menggunaan ingredient model
ingredients : Ingredient[] = [
new Ingredient("Oreo", 1),
new Ingredient("Tepung", 1),
];
constructor() { }
ngOnInit(): void {
}
onIngredientAdded(ingredient : Ingredient){
this.ingredients.push(ingredient);
}
}
Karena kita bekerja dengan element form, pastikan FormsModule diimport melalui app.module.ts (lihat baris yang diberi comment).
import { NgModule} from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
//import formsmodule
import {FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HeaderComponent } from './header/header.component';
import { RecipesComponent } from './recipes/recipes.component';
import { RecipeListComponent } from './recipes/recipe-list/recipe-list.component';
import { RecipeDetailComponent } from './recipes/recipe-detail/recipe-detail.component';
import { RecipeItemComponent } from './recipes/recipe-list/recipe-item/recipe-item.component';
import { ShoppingListComponent } from './shopping-list/shopping-list.component';
import { ShoppingEditComponent } from './shopping-list/shopping-edit/shopping-edit.component';
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
RecipesComponent,
RecipeListComponent,
RecipeDetailComponent,
RecipeItemComponent,
ShoppingListComponent,
ShoppingEditComponent
],
imports: [
BrowserModule,
FormsModule //import formsmodule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Sesuai ekspektasi, ingredient berhasil ditambahkan pada shopping-list.