angular - Angular:更新表单......奇怪的行为
问题描述
在我的 Angular 项目中,我有一个表单来更新用户信息。我的 UserAccount 类是:
import { Useraccounttype } from './../model/useraccounttype.model';
import { Gender } from './Gender.interface';
export interface UserAccount{
// User infos
id?: number;
firstName: string;
lastName: string;
mail: string;
genderId: number;
gender?: Gender;
password: string;
userName: string;
login: string;
useraccountTypeId: number;
userAccountType?: Useraccounttype;
name?: string;
commercialmail?: string;
phone?: string;
vatnumber?: string;
}
例如,如果我只更改名字字段。当我提交表单并想读取字段以使用以下方法更新数据库时:
private executeUserAccountUpdate = (userForm) => {
if (this.myForm.valid) {
const user: UserAccount = {
id: this.user.id,
firstName: this.f.firstname.value,
lastName: this.f.lastname.value,
mail: this.f.mail.value,
genderId: this.f.gender.value,
password: this.f.password.value,
userName: this.f.username.value,
login: this.f.login.value,
useraccountTypeId: this.f.useraccountType.value,
}
let apiUserAccount: string = environment.apiAddress + 'UserAccount/' + this.user.id;
this.repository.update(apiUserAccount, user)
.subscribe(response => {
$('#successModal').modal();
},
(error =>{
this.errorHandler.handleError(error);
this.errorMessage = this.errorHandler.errorMessage;
})
)
}
else {
console.log('Is not Valid');
}
}
在我的 User 对象中,字段 firstname 具有值,但其他字段为空 ('')。
Html部分:
<div class="container rounded bg-white mt-5 mb-5">
<form [formGroup]="myForm" autocomplete="off" novalidate (ngSubmit)="updateUserAccount(myForm.value)">
<div class="row">
<div class="col-md-3 border-right">
<div class="d-flex flex-column align-items-center text-center p-3 py-5">
<img class="rounded-circle mt-5" width="150px" src="https://st3.depositphotos.com/15648834/17930/v/600/depositphotos_179308454-stock-illustration-unknown-person-silhouette-glasses-profile.jpg">
<span class="font-weight-bold">{{user?.firstName}} {{user?.lastName}}</span>
<span class="text-black-50">{{user?.mail}}</span>
<span></span>
</div>
</div>
<div class="col-md-5 border-right">
<div class="p-3 py-5">
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="text-right color-secondary">Profile</h4>
</div>
<div class="row mt-2">
<div class="col-md-12">
<app-gender name="gender" id="gender" [formGroup]="myForm" [selectedValue]="user?.gender?.description">
<em *ngIf="validateControl('gender') && hasError('gender', 'required')">Sélectionnez un genre</em>
</app-gender>
</div>
</div>
<div class="row mt-2">
<div class="col-md-6"><label class="labels">Nom</label><input type="text" class="form-control" formControlName="lastname" placeholder="Nom" value="{{user?.firstName}}" >
<em *ngIf="validateControl('lastname') && hasError('lastname', 'required')">Nom obligatoire</em>
</div>
<div class="col-md-6"><label class="labels">Prénom</label><input type="text" class="form-control" formControlName="firstname" value="{{user?.lastName}}" placeholder="Prénom" >
<em *ngIf="validateControl('firstname') && hasError('firstname', 'required')">Prénom obligatoire</em>
</div>
</div>
<div class="row mt-3">
<div class="col-md-12 mt-2"><label class="labels">Nom d'utilisateur</label><input type="text" class="form-control" formControlName="username" placeholder="Nom d'utilisateur" value="{{user?.userName}}" >
<em *ngIf="validateControl('username') && hasError('username', 'required')">Nom d'utiliateur obligatoire</em>
</div>
<div class="col-md-12 mt-2"><label class="labels">Mail</label><input type="text" class="form-control" formControlName="mail" placeholder="Mail" value="{{user?.mail}}" >
<em *ngIf="validateControl('mail') && hasError('mail', 'required')">Mail obligatoire</em>
</div>
<div class="col-md-12 mt-2"><label class="labels">Login</label><input type="text" class="form-control" formControlName="login" placeholder="Login" value="{{user?.login}}" >
<em *ngIf="validateControl('login') && hasError('login', 'required')">Login obligatoire</em>
</div>
<div class="col-md-12 mt-2"><label class="labels">Password</label><input type="text" class="form-control" formControlName="password" placeholder="Password" value="{{user?.password}}" >
<em *ngIf="validateControl('password') && hasError('password', 'required')">Mot de passe obligatoire</em>
</div>
<!-- <div class="col-md-12"><label class="labels">Type de compte</label><input type="text" class="form-control" formControlName="useraccountType" placeholder="enter address line 2" value="{{user?.userAccountType?.shortDescription}}" ></div> -->
</div>
<div class="row mt-3">
<div class="col-md-12">
<label class="labels">Type d'utilisateur</label>
<app-useraccount-type name="useraccountType" id="useraccountType" [formGroup]="myForm" [selectedType]="user?.userAccountType?.shortDescription">
<em *ngIf="validateControl('useraccountType') && hasError('useraccountType', 'required')">Mot de passe obligatoire</em>
</app-useraccount-type>
</div>
</div>
<div class="row mt-3">
<div class="col-md-6"><label class="labels">Country</label><input type="text" class="form-control" placeholder="country" value=""></div>
<div class="col-md-6"><label class="labels">State/Region</label><input type="text" class="form-control" value="" placeholder="state"></div>
</div>
<div class="mt-5 text-center"><button class="btn btn-primary profile-button" type="submit">Sauvegarder</button></div>
</div>
</div>
<div class="col-md-4">
</div>
</div>
</form>
</div>
我不明白为什么,也不知道如何解决这个问题。
谁能解释一下并给我一个更新完整对象的解决方案。
谢谢你的帮助。
解决方案
这是我的问题的解决方案。我在这里找到了链接
首先要做的是使用 patchValue() 用数据填充表单。所以当我加载数据时,我必须这样做:
public loadUserDetails = () => {
let id: string = this.activeRoute.snapshot.params['id'];
let apiUser: string = environment.apiAddress + 'UserAccount' + '/' + id;
this.repository.getData(apiUser).pipe()
.subscribe(response => {
this.myForm.patchValue({
firstname: (<UserAccount>response).firstName,
lastname: (<UserAccount>response).lastName,
mail: (<UserAccount>response).mail,
Gender: (<UserAccount>response).genderId,
password: (<UserAccount>response).password,
username: (<UserAccount>response).userName,
login: (<UserAccount>response).login,
useraccountType: (<UserAccount>response).useraccountTypeId,
})
},
(error) => {
this.errorHandler.handleError(error);
this.errorMessage = this.errorHandler.errorMessage;
})
}
当我提交表单时,我需要这样做来获取表单数据:
public updateUserAccount= () =>{
const userAccountForm = this.myForm.value
if(this.myForm.valid){
this.executeUserAccountUpdate(userAccountForm)
}
else{
console.log('Is not Valid');
}
}
希望可以帮助别人。感谢大家的帮助。
推荐阅读
- mysql - 使用 GROUP BY 时选择与有序条件匹配的行
- django - TypeError:'Review' 对象不可迭代 Django 对象不可迭代
- asp.net-mvc - linq to entity 无法识别该方法
- node.js - Laravel 编译“错误:找不到 PATH/node_modules/laravel-mix/..”
- javascript - Javascript 数组的自定义排序功能适用于 Chrome 控制台,但不适用于 React
- angular - 角度异步函数 OnInit
- python - 某些行值的有条件增加 - Pandas
- ecmascript-6 - ES6 Import 为对象提供未定义
- bash - 写入具有特定字体大小的文件
- c# - 创建订单时的 3pl api 中心不起作用