这里已经存在类似的问题(设置初始值Angular 2 reactive formarray)但我对答案不满意或者可能正在寻找其他解决方案.
我认为使用FormArray的重点是传递对象数组,它应该创建相同数量的组件.但是在上面的示例中,如果查看提供的plunker,即使提供了两个Addresses对象,也会创建一个Address,因为它的空白版本已经在ngOnInit()中创建.
所以我的问题是,如果在ngOnInit()我有这样的地址:this._fb.array([])//空白列表,那么我该如何设置它的值,它动态地从N个地址创建N个地址在我的TypeScript数组中?
javascript forms reactive-forms angular angular-reactive-forms
我正在使用Angular2处理应用程序.我试图在我的应用程序中使用Reactive Forms但我遇到了一些错误:
第一个错误是关于NgControl,如下所示:
没有NgControl的提供者("
div class ="col-md-8"[ERROR - >] input class ="form-control"id ="productNameId""):ProductEditComponent @ 16:24
第二个错误是关于ControlContainer,如下所示:
没有ControlContainer的提供者("div [ERROR - >] div formArrayName ="tags">
div class ="row">
按钮cl"):
Htmm文件如下:
<div class="panel panel-primary">
<div class="panel-heading">
{{pageTitle}}
</div>
<div class="panel-body">
<form class="form-horizontal"
novalidate
(ngSubmit)="saveProduct()"
formGroup="productForm" >
<fieldset>
<div class="form-group"
[ngClass]="{'has-error': displayMessage.productName }">
<label class="col-md-2 control-label" for="productNameId">Product Name</label>
<div class="col-md-8">
<input class="form-control"
id="productNameId"
type="text"
placeholder="Name (required)"
formControlName="productName" />
<span class="help-block" *ngIf="displayMessage.productName">
{{displayMessage.productName}}
</span>
</div>
</div>
<div formArrayName="tags">
<div class="row">
<button class="col-md-offset-1 col-md-1 btn btn-default" …Run Code Online (Sandbox Code Playgroud) 我有一个包含很多表单控件和一些控件的验证器的表单,例如:
title = new FormControl("", Validators.compose([
Validators.required
]));
description = new FormControl("", [
Validators.required,
Validators.minLength(1),
Validators.maxLength(2000)
]);
Run Code Online (Sandbox Code Playgroud)
如何添加不验证控件的另存为草稿按钮?或删除它们?
我尝试了很多示例,例如:
saveDraft() {
this.addProjectForm.controls.title.clearValidators();
this.addProjectForm.controls.title.setErrors(null);
this.addProjectForm.controls.title.setValidators(null);
}
Run Code Online (Sandbox Code Playgroud)
要么
saveDraft() {
this.addProjectForm.controls['title'].clearValidators();
this.addProjectForm.controls['title'].setErrors(null);
this.addProjectForm.controls['title'].setValidators(null);
}
Run Code Online (Sandbox Code Playgroud)
但没有任何效果..
我希望我的FormControl( FormGroup/ FormArray) 是强类型的,所以当我有例如
interface SomeSource {
id: string;
name: string;
}
Run Code Online (Sandbox Code Playgroud)
我把它变成了例如
let form = new FormGroup<SomeSource>({
id: new FormControl('test id'),
name1: new FormControl('test name')
});
Run Code Online (Sandbox Code Playgroud)
TypeScript 抛出了一个错误:在name上找不到FormGroup。
同样在理想的世界中form.value应该是SomeSource类型(而不是any)。
问题是没有办法为任何AbstractFormControl孩子指定这个泛型类型。
我认为这很容易FormGroup用自己的界面覆盖。但是,有没有办法仅使用 Angular 来实现这一目标?如果没有,是否有第三方解决方案?
动机:我想轻松重构我的SomeSource. 目前,当我重构SomeSource界面时,表单未适配且未抛出错误 => 存在一些错误的空间。
我的计划是将表单的值存储在我的ngrx商店中,以允许我的用户浏览网站并返回表单(如果他们愿意).我们的想法是,表单的值将使用可观察对象从商店重新填充.
这是我目前正在做的事情:
constructor(private store: Store<AppState>, private fb: FormBuilder) {
this.images = images;
this.recipe$ = store.select(recipeBuilderSelector);
this.recipe$.subscribe(recipe => this.recipe = recipe); // console.log() => undefined
this.recipeForm = fb.group({
foodName: [this.recipe.name], // also tried with an OR: ( this.recipe.name || '')
description: [this.recipe.description]
})
}
Run Code Online (Sandbox Code Playgroud)
商店给出了一个初始值,我已经看到它正确地通过我的选择器函数,但是当我的表单被创建时,我不认为该值已经返回.因此this.recipe仍未定义.
这是错误的方法,还是我能以某种方式确保在创建表单之前返回observable?
我有用于创建和编辑操作的反应式表单。对于编辑,我只是在表单上,就像一个魅力,但来自 PrimeNg InputText 组件的浮动标签没有注意到有值填充。当我单击其中一个输入然后对其进行模糊处理时,每个输入都会更新视图并且所有标签都在顶部。patchValue(data)
我已经尝试过更改检测(视图组件将其设置为OnPush), markAsDirty(),markAllAsTouched()即使标签仍然在输入值上。不知道如何在其中一个控件上触发类似于物理模糊的 smth(不想在代码中触发它,@ViewChild()因为它对我来说看起来是错误的解决方案。
任何想法如何解决这一问题?
我试图在Angular 2中实现一个模型驱动的表单.我的数据模型的结构如下:
archive (FormGroup)
name (FormControl)
description (FormControl)
connection (FormGroup)
url (FormControl)
authentication (FormGroup)
username (FormControl)
password (FormControl)
Run Code Online (Sandbox Code Playgroud)
在此数据模型中,顶级名称是必需的,但描述字段是可选的.我可以应用必需的验证器来命名,并省略描述中的验证器.
对于连接,我希望它是可选的,但如果存在连接,则其URL成为必需.类似地,对于连接的身份验证模型:它是可选的,但如果存在,则需要用户名和密码.
我试图了解如何设置验证器来强制执行这些规则.我试过从连接表单组中省略任何验证器,但这似乎要求我建立连接.我已经看过在线教程,解释了如何在嵌套表单组上实现自定义验证,但没有描述如何使整个嵌套表单组可选.
有没有一种直接的方法来使用Angular 2 FormGroup实现此模型?
我目前正在使用 angular 2 和反应式表单构建更新、添加、删除和编辑表单。我已将控件分组到一个表单构建器数组中,以将输入控件动态添加到表单数组中。这适用于没有任何要初始化的项目的空表单。
export class ItemsPage{
collectionForm: FormGroup;
get items(): FormArray { return <FormArray>this.collectionForm.get('items'); }
constructor(public formBuilder: FormBuilder){
this.pageDetails = this.navParams.data;
this.collectionForm = this.formBuilder.group({
items: this.formBuilder.array([this.buildItem()])
});
}
buildItem(item?: string): FormGroup {
return this.formBuilder.group({ item: [item || '', Validators.required] });
}
ionViewDidLoad() {
// Builds a form with pre populated items
forEach(this.pageDetails, value => {
this.items.push(this.buildItem(value));
})
}
}
Run Code Online (Sandbox Code Playgroud)
问题是视图中的控件列表在index 0whenthis.pageDetails有一个值列表时包含一个空输入。这可以在 constructor with 中删除
this.items.removeAt(0);
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不对。我想也许我可以在它的formBuilder.array
let prebuildItems = forEach(this.pageDetails, value => { // …Run Code Online (Sandbox Code Playgroud) 用户数组可以具有多个元素(用户)。在模板中,我遍历此数组并为每个元素添加一个表单。现在,每个表单都绑定到相同的表单组值。如果我为第一个用户填写表格,则所有表格的提交按钮都将启用。如何将每个表单指向唯一的formGroup或唯一的变量?
零件:
import { FormControl, FormGroup, Validators, FormBuilder} from '@angular/forms';
...
export class UserComponent implements OnInit {
form: FormGroup;
@input users: any[];
constructor(private _fb: FormBuilder) {}
ngOnInit() {
this.form = this._fb.group({
address: new FormControl('', [Validators.required]),
phone: new FormControl('', [Validators.required]),
});
}
add() {
if (this.form.valid){
// code
}
}
Run Code Online (Sandbox Code Playgroud)
模板:
<div *ngFor="let user if users">
{{user.name}}
<form [formGroup]="form" (ngSubmit)="add()">
<div class="form-group">
<label>Address:</label>
<input formControlName="address" class="form-control">
<label>Phone:</label>
<input formControlName="phone" class="form-control"></input>
</div>
<button type="submit" class="submit" [disabled]="!form.valid">Submit</button>
</form>
</div>
Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,当后续问题中存在相同的标签时,我的单选按钮(视图)与我的模型(反应形式)不同步。
我正在创建某种调查应用程序,其中(当然)包含多个问题,但是当 2 个后续问题在不同位置包含相同的答案标签时,在选择其中一个问题并在 2 个问题之间导航时,视图会不同步。我创建了一个Stackblitz来说明这个问题。(没有材料的相同Stackblitz)
复制步骤错误选择:
繁殖步骤双选:
有关该应用程序的更多信息,我已在 stackblitz 的父组件 (survey-parent.component.html) 中添加了说明。
我不确定这是 Angular 中的错误还是我在这里做错了什么。
angular ×10
reactive-forms ×10
typescript ×2
forms ×1
html ×1
javascript ×1
ngrx ×1
observable ×1
parent-child ×1
primeng ×1