user-form.component.ts
angular/examples/intermediate/user-form.component.ts
// @ts-nocheck
import { Component, inject, signal } from '@angular/core';
import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { UsersService } from './users.service';
@Component({
selector: 'app-user-form',
standalone: true,
imports: [ReactiveFormsModule],
template: `
<form [formGroup]="form" (ngSubmit)="save()">
<label>
Name
<input formControlName="name" />
</label>
<label>
Email
<input formControlName="email" type="email" />
</label>
<label>
Role
<select formControlName="role">
<option value="viewer">Viewer</option>
<option value="editor">Editor</option>
<option value="admin">Admin</option>
</select>
</label>
<button type="submit" [disabled]="form.invalid || saving()">Save</button>
</form>
<p *ngIf="error()" class="error">Save failed: {{ error() }}</p>
`,
styles: [
`
form {
display: grid;
gap: 1rem;
max-width: 24rem;
}
.error {
color: #dc2626;
margin-top: 1rem;
}
`,
],
})
export class UserFormComponent {
private fb = inject(FormBuilder);
private users = inject(UsersService);
form = this.fb.nonNullable.group({
name: ['', Validators.required],
email: ['', [Validators.required, Validators.email]],
role: ['viewer', Validators.required],
});
saving = signal(false);
error = signal<string | null>(null);
save(): void {
if (this.form.invalid || this.saving()) {
return;
}
this.saving.set(true);
this.error.set(null);
this.users
.saveUser(this.form.getRawValue())
.pipe(takeUntilDestroyed())
.subscribe({
next: () => {
this.saving.set(false);
this.form.reset({ role: 'viewer' });
},
error: (err) => {
this.saving.set(false);
this.error.set(err?.message ?? 'Unknown error');
},
});
}
}
相關文章
server.js
server.js — javascript source code from the angular learning materials (angular/comprehensive-demo/server/server.js).
閱讀文章 →app.component.ts
app.component.ts — typescript source code from the angular learning materials (angular/comprehensive-demo/src/app/app.component.ts).
閱讀文章 →app.config.ts
app.config.ts — typescript source code from the angular learning materials (angular/comprehensive-demo/src/app/app.config.ts).
閱讀文章 →app.routes.ts
app.routes.ts — typescript source code from the angular learning materials (angular/comprehensive-demo/src/app/app.routes.ts).
閱讀文章 →auth.guard.ts
auth.guard.ts — typescript source code from the angular learning materials (angular/comprehensive-demo/src/app/core/guards/auth.guard.ts).
閱讀文章 →role.guard.ts
role.guard.ts — typescript source code from the angular learning materials (angular/comprehensive-demo/src/app/core/guards/role.guard.ts).
閱讀文章 →