Menerapkan Dialog Formulir Upsert di Angular
Banyak aplikasi memerlukan kemampuan untuk membuat dan memperbarui rekaman melalui antarmuka pengguna. Biasanya, kami ingin menggunakan komponen dialog yang sama untuk kedua operasi. Istilah "upert" adalah kombinasi dari kata "update" dan "insert", dan mengacu pada fakta bahwa dialog dapat digunakan untuk membuat record baru atau memperbarui yang sudah ada.
Mari kita lihat bagaimana kita dapat mengimplementasikan fungsi ini. Saya akan menggunakan ngneat/dialogperpustakaan, tetapi Anda dapat menggunakan apa pun yang Anda suka. Pertama, kita akan membuat antarmuka bersama untuk yang dataharus diteruskan ke dialog kita:
export interface UpsertDialogData<T> {
action: 'add' | 'edit';
actions$: Record<
UpsertDialogData['type'],
(value: T) => Observable<any>
>;
currentValue: T | undefined;
}
Sekarang mari kita buat upsertkomponen dialog dasar:
import { DialogRef } from '@ngneat/dialog';
import { loadingFor } from '@ngneat/loadoff';
import { HotToastService } from '@ngneat/hot-toast';
@Directive()
export abstract class UpsertDialogComponent<Entity extends Record<string, any>>
implements OnInit
{
private toast = inject(HotToastService);
loader = loadingFor('upsert');
ref: DialogRef<UpsertDialogData<Entity>> = inject(DialogRef);
abstract get form(): FormGroup;
abstract getMessages(): Record<UpsertDialogData['action'], string>;
get action() {
return this.ref.data.action;
}
ngOnInit() {
if (this.ref.data.action === 'edit') {
this.form.patchValue(this.ref.data.currentValue);
}
}
upsert() {
if (this.form.invalid) return;
this.ref.data.actions$[this.action](this.form.getRawValue())
.pipe(this.loader.upsert.track())
.subscribe(() => {
this.ref.close();
this.toast.success(this.getMessages()[this.action]);
});
}
}
Mari gunakan kelas dasar kita dan buat dialog untuk upserting pengguna:
import { errorTailorImports } from '@ngneat/error-tailor';
@Component({
standalone: true,
imports: [errorTailorImports],
templateUrl: `./upsert-user-dialog.component.html`
})
export class UpsertUserDialogComponent extends UpsertDialogComponent<User> {
form = inject(FormBuilder).nonNullable.group({
name: ['', Validators.required],
});
getMessages() {
return {
add: `User was added successfully`,
edit: `User was updated successfully`,
};
}
}
<header>
<h3>{{ action === 'edit' ? 'Edit User' : 'New User' }}</h3>
</header>
<div>
<form [formGroup]="form" errorTailor>
<input
placeholder="Name"
formControlName="name" />
</form>
</div>
<footer>
<button dialogClose>Cancel</button>
<button
[loading]="loader.upsert.inProgress$ | async"
(click)="upsert()"
>
{{ action === 'edit' ? 'Save' : 'Create' }}
</button>
</footer>
@Component({
template: `
<button (click)="openUpsertUserDialog('add')">Add User</button>
<-- ngFor -->
<button (click)="openUpsertUserDialog('edit', user)">Edit</button>
`
})
export class UsersPageComponent {
openUpsertUserDialog(
action: UpsertDialogData['action'],
currentValue?: UpsertDialogData<User>['currentValue']
) {
this.dialogService.open(UpsertUserDialogComponent, {
data: {
action,
currentValue,
actions$: {
add: (user) => this.usersService.addUser({ user}),
edit: (user) => this.usersService.updateUser({ user }),
},
},
});
}
}

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































