Pada modul ini kita akan memperbaiki form shopping-edit.component.html agar button ditampilkan sesuai status edit atau add new item.
Buka file shopping-edit.component.html, kemudian tambah code untuk mengubah tulisan button dengan memeriksa property isEdit.
<div class="row"> <div class="col-xs-12"> <form (ngSubmit)="onAddItem(f)" #f="ngForm"> <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" name="name" ngModel required> </div> <div class="col-sm-2 form-group"> <label for="amount" class="form-label">Amount</label> <input type="number" class="form-control" id="amount" name="amount" ngModel required pattern="^[1-9]+[0-9]*$"> </div> </div> <div class="row mt-2"> <div class="col-xs-12"> <button class="btn btn-success me-1" type="submit" [disabled]="f.invalid"> {{isEdit ? 'Update' : '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>
Kemudian buka file shopping-list.service.ts, kita tambahkan fungsi untuk melakukan update.
Perlu kami akui, penamaan property neInggredietAdded tidak sesuai konteks karena sekarang digunakan juga untuk proses update. Jika Anda ingin mengubah, silakan lakukan perubahan.
import { Subject } from "rxjs"; import { Ingredient } from "../shared/ingredient.model"; export class ShoppingListService{ newInggredientAdded = new Subject<Ingredient[]>(); //tambahkan untuk shopping list edit. startEdit = new Subject<number>(); private ingredients : Ingredient[] = [ new Ingredient("Oreo", 1), new Ingredient("Tepung", 1), ]; getIngredients(){ return this.ingredients.slice(); } //method untuk mengambil data ingredient berdasarkan id. getIngredient(idx : number){ return this.ingredients[idx]; } addIngredient(ingredient : Ingredient){ this.ingredients.push(ingredient); this.newInggredientAdded.next(this.ingredients.slice()); } addIngredients(ingredients: Ingredient[]){ this.ingredients.push(...ingredients); this.newInggredientAdded.next(this.ingredients.slice()); } //tambahkan method untuk melakukan update ingredient. updateIngredient(idx: number, ingredient: Ingredient){ this.ingredients[idx] = ingredient; this.newInggredientAdded.next(this.ingredients.slice()); } }
Buka file shopping-edit.component.ts, lalu tambahkan code untuk melakukan update.
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { NgForm } from '@angular/forms'; import { Subscription } from 'rxjs'; import { Ingredient } from 'src/app/shared/ingredient.model'; import { ShoppingListService } from '../shopping-list.service'; @Component({ selector: 'app-shopping-edit', templateUrl: './shopping-edit.component.html', styleUrls: ['./shopping-edit.component.css'] }) export class ShoppingEditComponent implements OnInit, OnDestroy { @ViewChild('f', {static:false}) slForm! : NgForm; shoplistSubc! : Subscription; isEdit = false; editIdx = 0; editIngredient! : Ingredient; constructor(private shoppingListServ : ShoppingListService) { } ngOnInit(): void { this.shoplistSubc = this.shoppingListServ.startEdit.subscribe( (idx : number)=>{ this.isEdit = true; this.editIdx = idx; this.editIngredient = this.shoppingListServ.getIngredient(idx); this.slForm.setValue({ name : this.editIngredient.name, amount : this.editIngredient.amount }); } ); } //tambahkan code untuk melakukan update ingredient onAddItem(form : NgForm){ const value = form.value; const newIngredient = new Ingredient(value.name, value.amount); if (this.isEdit) { this.shoppingListServ.updateIngredient(this.editIdx, newIngredient); }else{ this.shoppingListServ.addIngredient(newIngredient); } } ngOnDestroy(): void { this.shoplistSubc.unsubscribe(); } }
Sesuai ekspektasi, kita sudah bisa melakukan update ingredient.
Pada modul berikutnya kita akan tambahkan fitur untuk reset form setelah proses add atau update. Dan menambahkan fitur Del dan Clear.