【发布时间】:2019-04-08 03:14:34
【问题描述】:
早安,
我正在使用 Angular 6、Java Spring 和 mysql 数据库构建一个 webApplication。 我构建了一个用于创建和更新客户数据的表单。
在创建客户时,使用 REST 将数据传递到服务器,这很有效,因为我的请求的谷歌控制台输出是一个 json 字符串,它将表单模型和输入到该表单的数据相关联。
我的问题是在更新时,我用客户端数据填充表单,但是当我提交时,谷歌的控制台在我的发布请求中输出一个空对象。
我的表格:
<div class="container spacer borders" *ngIf="showClientForm">
<form [formGroup]="form" (ngSubmit)="updateClient(this.form.value)">
<div class="form-row">
<div class="form-group col-md-6">
<p><b>Edition Client</b></p>
<input type="text"
class="form-control"
id="name"
placeholder="Raison sociale ou Nom et Prénom"
[(value)]="selectedClient.nom"
formControlName = "nom"
/>
<input type="text"
class="form-control small-spacer"
id="email"
placeholder="Raison sociale ou Nom et Prénom"
[(value)]="selectedClient.email"
formControlName = "email"
/>
</div>
<div class="form-check-inline col-md-6">
<input class="form-check-input"
type="radio"
id="type_particulier"
name="typeClient"
[(value)]="selectedClient.value"
formControlName = "typeClient"
/>
<label class="form-check-label" for="type_particulier">
Particulier
</label>
<input class="form-check-input spacer-left"
type="radio"
name="typeClient"
id="type_professionnel"
[(value)]="selectedClient.value"
formControlName="typeClient"
/>
<label class="form-check-label" for="type_professionnel">
Professionnel
</label>
</div>
</div>
<div class="form-row spacer">
<div class="form-group col-md-6 spacer" formGroupName="adresseFacturation">
<p><b>Adresse Facturation</b></p>
<input type="text"
class="form-control"
id="adr_fact"
placeholder="Numéro, voie ..."
[(value)]="selectedClient.adresseFacturation.rue"
formControlName="rue"
/>
<input type="text"
class="form-control small-spacer"
id="adr_fact"
placeholder="Complément d'adresse"
[(value)]="selectedClient.adresseFacturation.complement"
formControlName="complement"
/>
<div class="form-row">
<div class="col-md-6">
<input type="text"
class="form-control small-spacer"
id="gc_cp"
placeholder="Code Postal"
[(value)]="selectedClient.adresseFacturation.codePostal"
formControlName="codePostal"
/>
</div>
<div class="col-md-6">
<input type="text"
class="form-control small-spacer"
id="gc_ville"
placeholder="Ville"
[(value)]="selectedClient.adresseFacturation.ville"
formControlName="ville"
/>
</div>
</div>
</div>
<div class="form-group col-md-6 spacer" formGroupName="adresseTravaux">
<p><b>Adresse Travaux</b></p>
<input type="text"
class="form-control"
id="adr_fact"
placeholder="Numéro, voie ..."
[(value)]="selectedClient.adresseTravaux.rue"
formControlName="rue"
/>
<input type="text"
class="form-control small-spacer"
id="adr_fact"
placeholder="Complément d'adresse"
[(value)]="selectedClient.adresseTravaux.complement"
formControlName="complement"
/>
<div class="form-row">
<div class="col-md-6">
<input type="text"
class="form-control small-spacer"
id="gc_cp"
placeholder="Code Postal"
[(value)]="selectedClient.adresseTravaux.codePostal"
formControlName="codePostal"
/>
</div>
<div class="col-md-6">
<input type="text"
class="form-control small-spacer"
id="gc_ville"
placeholder="Ville"
[(value)]="selectedClient.adresseTravaux.ville"
formControlName="ville"
/>
</div>
</div>
</div>
</div>
<div class="spacer">
<button class="btn btn-dark" type="submit">Enregistrer</button>
<button class="btn btn-dark spacer-left" type="button" (click)="returnToList()">Retour</button>
</div>
</form>
</div>
当我在每个输入字段上删除 [(value)]="selectedClient.nom" 时,我可以使用该表单创建一个客户,但是当我尝试绑定 value 属性以便用客户填充值以更新此值时,表单模型会不考虑。
这是我的组件 .ts,其中包括模型:
import { Component, OnInit } from '@angular/core';
import { ClientService } from '../services/client.service';
import { FormBuilder, FormGroup } from '@angular/forms';
@Component({
selector: 'app-gest-clients',
templateUrl: './gest-clients.component.html',
styleUrls: ['./gest-clients.component.css']
})
export class GestClientsComponent implements OnInit {
clients:Array<Object> = [];
selectedClient;
showClientForm = false;
showNewClientForm = false;
form:FormGroup;
msg;
constructor(private clientService:ClientService,
private formBuilder:FormBuilder) { }
ngOnInit() {
this.clientService.GetClientList().subscribe(
data => this.handleContent(data)
);
this.form = this.formBuilder.group({
'id':'',
'nom':'',
'email':'',
'adresseFacturation' : this.formBuilder.group({
'id':'',
'rue':'',
'complement':'',
'ville':'',
'codePostal':'',
'complementCodePostal':'',
'supprimer':''
}),
'adresseTravaux' : this.formBuilder.group({
'id':'',
'rue':'',
'complement':'',
'ville':'',
'codePostal':'',
'complementCodePostal':'',
'supprimer':''
}),
'typeClient':'',
'supprimer':''
});
}
selectClient(client){
this.showClientForm = true;
this.selectedClient = client;
}
deleteClient(Client){
}
handleContent(data){
this.clients = data;
}
updateClient(data){
console.log(data) **// Empty json string (model only) KO**
this.clientService.updClient(data).subscribe(
res => this.msg = res,
error => this.msg = error
)
}
returnToList(){
this.form.reset()
this.selectedClient = null;
this.showClientForm = false;
this.showNewClientForm = false;
}
addNew(){
this.showNewClientForm = true;
}
AddNewClient(clientFormData){
console.log(clientFormData) // Correct json string (model + data) ok
this.clientService.CreateNewClient(clientFormData).subscribe(
res => this.msg = res,
error => this.msg = error
)
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule } from '@angular/router';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { NavbarComponent } from './navbar/navbar.component';
import { DevisComponent } from './devis/devis.component';
import { CommandeComponent } from './commande/commande.component';
import { GestDevisComponent } from './gest-devis/gest-devis.component';
import { GestCommandeComponent } from './gest-commande/gest-commande.component';
import { GestClientsComponent } from './gest-clients/gest-clients.component';
import { GestFournisseursComponent } from './gest-fournisseurs/gest-fournisseurs.component';
import { GestMaterielsComponent } from './gest-materiels/gest-materiels.component';
import { GestPrestationsComponent } from './gest-prestations/gest-prestations.component';
import { MaterielComponent } from './materiel/materiel.component';
import { PrestationComponent } from './prestation/prestation.component';
import { HomeComponent } from './home/home.component';
import { ClientService } from './services/client.service';
const routes = [
{path:"", component:HomeComponent},
{path:"devis", component:DevisComponent},
{path:"commande", component:CommandeComponent},
{path:"materiel", component:MaterielComponent},
{path:"prestation", component:PrestationComponent},
{path:"gestDevis", component:GestDevisComponent},
{path:"gestCommandes", component:GestCommandeComponent},
{path:"gestFournisseurs", component:GestFournisseursComponent},
{path:"gestMateriels", component:GestMaterielsComponent},
{path:"gestClients", component:GestClientsComponent},
{path:"gestPrestations", component:GestPrestationsComponent}
]
@NgModule({
declarations: [
AppComponent,
NavbarComponent,
DevisComponent,
CommandeComponent,
GestDevisComponent,
GestCommandeComponent,
GestClientsComponent,
GestFournisseursComponent,
GestMaterielsComponent,
GestPrestationsComponent,
MaterielComponent,
PrestationComponent,
HomeComponent
],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot(routes),
FormsModule, ReactiveFormsModule
],
providers: [ClientService],
bootstrap: [AppComponent]
})
export class AppModule { }
【问题讨论】:
-
我建议您使用 FormGroup 和 FormControl 实现适当的反应式表单,如官方 Angular 文档中所述:angular.io/guide/reactive-forms 然后您的输入如下所示:
<input type="text" formControlName="firstName"> -
感谢您的文档,我会努力解决的。在我的问题上添加了我的 app.module.ts
-
你是对的,正确实施一切都按预期工作。
-
我很高兴来到这里。我今天会写一个干净的答案:)
标签: angular typescript data-binding angular-reactive-forms