我使用的是棱角形,我有一个反应式表格可以编辑项目。当我打开要编辑的组件时,输入会正确加载对象的值,但是如果我不单击输入并更改值,则反应形式的值将为空。
我的代码在这里:
<form [formGroup]="entidadesForm">
<div class="row">
<div class="col-lg-12">
<nb-card>
<nb-card-header>Digite os dados solicitados</nb-card-header>
<nb-card-body>
<div class="form-group">
<label class="container-title" >Nome</label>
<input type="text" autocomplete="off" formControlName="Nome" value="{{nome}}" class="form-control" placeholder="Nome" class="form-control"
/>
</div>
<div class="form-group" *ngIf="entidade === 'setor' || entidade === 'unidadeproduto' " >
<label class="container-title">Descricao</label>
<input type="text" autocomplete="off" value="{{descricao}}"placeholder="Descricao" class="form-control" formControlName="Descricao"
/>
</div>
<div class="form-group" *ngIf="entidade === 'unidadeproduto' " >
<label class="container-title">Pode Fracionar</label>
<select class="form-control" formControlName="PodeFracionar" >
<option *ngIf="!atualizar"></option>
<option [selected]="podeFracionar == 'S'" value="S" >Sim</option>
<option [selected]="podeFracionar == 'N'" value="N" >Nao</option>
</select>
</div>
</nb-card-body>
</nb-card>
</div>
</div>
</form>
和ts文件
constructor(private fb: FormBuilder, private entidadesProdutoService: EntidadesProdutoService, private route : ActivatedRoute, private router: Router, private location: Location) {
this.atualizar = false;
}
ngOnInit() {
this.route.queryParams.subscribe( params =>{
this.id = params['id'];
this.nome = params['nome'];
this.descricao = params['descricao'];
this.podeFracionar = params['podeFracionar'];
this.entidade = params['entidade'];
if(this.id !== undefined) this.atualizar = true;
});
this.entidadesForm = new FormsModels(this.fb).formularioModel(this.entidade)
}
salvar( ){
if(this.atualizar){
this.entidadesProdutoService.atualizar(this.id, this.entidadesForm.value, this.entidade).subscribe(response => {
this.location.back()
},
erro => console.log(erro))
}else{
this.entidadesProdutoService.salvar(this.entidadesForm.value, this.entidade).subscribe(response=>{
this.location.back()
},
erro => {
console.log(erro)
})
}
}
在此处定义表单的组件:
import { FormBuilder, FormGroup } from '@angular/forms';
export class FormsModels{
constructor(public fb: FormBuilder){}
public formularioModel(entidade): FormGroup{
if(entidade === 'categoria' || entidade === 'marca' || entidade === 'subcategoria' || entidade === 'secao' ){
return this.fb.group({
Nome: this.fb.control('', [])
})
}
else if(entidade === 'setor'){
return this.fb.group({
Nome: this.fb.control('', []),
Descricao: this.fb.control('', [])
})
}
else if(entidade === 'unidadeproduto'){
return this.fb.group({
Nome: this.fb.control('', []),
Descricao: this.fb.control('', []),
PodeFracionar: this.fb.control('', [])
})
}
}
}
当我加载组件时,输入加载正确的值,请参见图片:
如果我仅编辑输入nome作为示例,则输入descricao的形式值和select输入pod fracionar将为空,请在此处查看控制台。
答案 0 :(得分:1)
您的输入字段显示正确的值,因为您在html中设置了value="{{nome}}"
。
在创建FormGroup的过程中,您在控件配置this.fb.control('YOUR_EMTPY_STRING', [])
中将一个空字符串设置为值,因此控件的值为空。
因此,您需要在FormGroup创建期间设置控件的值,例如像这样:
this.route.queryParams.subscribe( params =>{
this.id = params['id'];
this.nome = params['nome'];
this.descricao = params['descricao'];
this.podeFracionar = params['podeFracionar'];
this.entidade = params['entidade'];
if(this.id !== undefined) this.atualizar = true;
// After receiving the router params init your FormGroup
this.entidadesForm = new FormsModels(this.fb).formularioModel(this.entidade)
});
...
public formularioModel(entidade): FormGroup{
if(entidade === 'categoria' || entidade === 'marca' || entidade === 'subcategoria' || entidade === 'secao' ){
return this.fb.group({
Nome: this.fb.control(this.nome, [])
})
} else if(entidade === 'setor'){
return this.fb.group({
Nome: this.fb.control(this.nome, []),
Descricao: this.fb.control(this.descricao, [])
})
} else if(entidade === 'unidadeproduto'){
return this.fb.group({
Nome: this.fb.control(this.nome, []),
Descricao: this.fb.control(this.descricao, []),
PodeFracionar: this.fb.control(this.podeFracionar, [])
})
}
}
否则,您可以像下面这样更新FormGroup的值:
this.route.queryParams.subscribe( params =>{
this.id = params['id'];
this.nome = params['nome'];
this.descricao = params['descricao'];
this.podeFracionar = params['podeFracionar'];
this.entidade = params['entidade'];
if(this.id !== undefined) this.atualizar = true;
// Updates the value of your FromGroup
this.entidadesForm.setValue({Nome: this.nome, Descricao: this.descricao, PodeFracionar: this.podeFracionar});
});
答案 1 :(得分:1)
您缺少有关Angular的基本设计原则。
在Angular中,唯一的真理点是模型。不是DOM。 DOM是基于模型生成的。因此,例如value="{{descricao}}"
和[selected]="podeFracionar == 'S'"
是错误的。
您不得在DOM中设置所选/输入的值。您必须在模型中进行设置。 Angular会根据模型包含的内容来设置值/选择选项,因为输入/选择已绑定到模型。
因此,在创建FormGroup时,初始化FormControls的值 。并且视图将显示/选择这些值。您正在做相反的事情,这是不正确的。